o
    j                     @   s^  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 eddG d	d
 d
ZdedefddZdeeB dedee fddZde jfddZdee fddZdee dee deeef fddZdddddddee dee dedededeee eef fdd Zdededee j fd!d"Zdd#ded$ededee fd%d&ZdS )'    N)	dataclass)Path)Optional)config)REMEDY_MARKERT)frozenc                   @   s:   e Zd ZU eed< eed< eed< eed< ee ed< dS )CheckinImageiduser_idcheckin_datecontent
image_pathN)__name__
__module____qualname__int__annotations__strr   r    r   r   7/home/dore/onebot/Bot_Ero/checkin_gallery/repository.pyr   
   s   
 r   r   returnc                 C   s   |  dd dd ddS )N{ }-)replace)r   r   r   r   _normalize_image_name   s   r   r
   c                 C   sD   t |}tjt|  }|| fD ]}|| }| r|  S qd S N)r   r   
IMAGE_ROOTr   loweris_file)r
   r   
image_namefoldername	candidater   r   r   resolve_image_path   s   r%   c                  C   s   t tj} t j| _| S r   )sqlite3connectr   DB_PATHRowrow_factory)connr   r   r   _connect!   s   r,   c                  C   sF   t  } | dtf }W d    n1 sw   Y  dd |D S )Nz
            SELECT DISTINCT CAST(user_id AS TEXT) AS user_id
            FROM checkin_records
            WHERE content != ?
            ORDER BY user_id
            c                 S   s   g | ]}|d  qS )r
   r   .0rr   r   r   
<listcomp>2   s    z!list_user_ids.<locals>.<listcomp>)r,   executer   fetchall)r+   rowsr   r   r   list_user_ids'   s   
r4   yearc                 C   sf   dg}t g}| d ur|d |t|  |d ur,|d || d| df d||fS )Nzcontent != ?zCAST(user_id AS TEXT) = ?zcheckin_date BETWEEN ? AND ?-01-01 00:00:00-12-31 23:59:59z AND )r   appendr   extendjoin)r
   r5   clausesparamsr   r   r   _build_where5   s   

r=      (   )r
   r5   page	page_sizeonly_with_filer@   rA   rB   c              
   C   s$  t | |\}}d| d}t }||| }	W d   n1 s#w   Y  |sLt|	}
|d | }|| }|	|| }dd |D }||
||
k fS g }|	D ]&}t|d |d }|du r`qP|t|d	 t|d |d
 |d |d qPt|}
|d | }|| }||| }||
||
k fS )uO   分页查询；仅含本地图片时通过游标式扫描满足 offset/limit。z^
        SELECT id, user_id, checkin_date, content
        FROM checkin_records
        WHERE z1
        ORDER BY checkin_date DESC, id DESC
    Nr>   c                 S   s@   g | ]}t |d  t|d |d |d t|d |d dqS )r	   r
   r   r   r	   r
   r   r   r   )r   r   r%   r-   r   r   r   r0   \   s    
z,fetch_checkins_paginated.<locals>.<listcomp>r
   r   r	   r   rC   )	r=   r,   r1   r2   lenr%   r8   r   r   )r
   r5   r@   rA   rB   wherer<   sqlr+   r3   totalstartend
slice_rowsitemsmatchedrowpath
page_itemsr   r   r   fetch_checkins_paginatedD   sF   	


rP   c                 C   sP   t  }|dt| | d| df W  d    S 1 s!w   Y  d S )Nz
            SELECT id, user_id, checkin_date, content
            FROM checkin_records
            WHERE CAST(user_id AS TEXT) = ?
            AND checkin_date BETWEEN ? AND ?
            ORDER BY checkin_date ASC
            r6   r7   )r,   r1   r   r2   )r
   r5   r+   r   r   r   fetch_user_year_rows~   s   	$rQ   )rB   day_keyc             
   C   s   ddl m} ||\}}t }|dt| t||f }W d    n1 s(w   Y  g }|D ](}	t|	d |	d }
|rC|
d u rCq1|t	|	d t|	d |	d |	d |
d q1|S )	Nr   )settlement_day_rangea  
            SELECT id, user_id, checkin_date, content
            FROM checkin_records
            WHERE CAST(user_id AS TEXT) = ?
            AND content != ?
            AND checkin_date BETWEEN ? AND ?
            ORDER BY checkin_date ASC, id ASC
            r
   r   r	   r   rC   )
checkin_gallery.datesrS   r,   r1   r   r   r2   r%   r8   r   )r
   rR   rB   rS   rH   rI   r+   r3   rK   rM   rN   r   r   r   fetch_user_settlement_day   s2   

	rU   )r&   dataclassesr   pathlibr   typingr   checkin_galleryr   checkin_gallery.configr   r   r   r   r   r%   
Connectionr,   listr4   tupler=   boolrP   r)   rQ   rU   r   r   r   r   <module>   s`    



: