o
    eOj                     @   sd  d dl m Z mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZ ded	ed
ee fddZ		 d#dedededed
eee ef f
ddZded	eded
eeef fddZded	ed
efddZdededed
dfddZ		 	d$dedededed
eee ef f
dd Z	d%deded
ee fd!d"Z dS )&    )datetimetimezone)OptionalList)selectupdatefuncor_desc)insert)AsyncSession)selectinload)Movie	MovieViewGenresessioncodereturnc                    sB   |  tttj| ktjdkttj	I dH }|
 S )zKino kodiga qarab topishTN)executer   r   wherer   upper	is_activeoptionsr   genresscalar_one_or_none)r   r   result r   D/var/www/www-root/data/www/ai-bot.pdev.uz/bot/database/crud/movie.pyget_movie_by_code   s   
r   
   querylimitoffsetc           
   
      s   d| d}t ttjdkttj|tj|tj|tj	|
ttj}| t t | I dH }| }| |ttj||I dH }|  }	t|	|fS )z_
    Nom yoki kod bo'yicha qidirish (case-insensitive).
    Returns: (movies, total_count)
    %TN)r   r   r   r   r	   r   iliketitle_uztitle_rutitle_enr   r   r   r   r   countselect_fromsubquery
scalar_oneorder_byr
   
view_countr!   r"   scalarsalllist)
r   r    r!   r"   search
base_querycount_resulttotalr   moviesr   r   r   search_movies   s.   




	

r6   channel_message_idc                    s   |  tttj|kI dH }| }|rD||_tt	j
|_| D ]\}}t||r8|dur8t||| q%|  I dH  |dfS td| |tt	j
d|}| | |  I dH  | |I dH  |dfS )zT
    Kinoni qo'shish yoki yangilash (sync uchun).
    Returns: (movie, created)
    NF)r   r7   	synced_atTr   )r   r   r   r   r   r   r7   r   nowr   utcr8   itemshasattrsetattrflushr   addrefresh)r   r   r7   kwargsexistingmoviekeyvaluer   r   r   upsert_movie=   s2   



rF   c                    sJ   |  tttj|kI dH }| }|sdS d|_|  I dH  dS )z9Kinoni o'chirish (soft delete). Returns True agar topilsaNFT)r   r   r   r   r   r   r   r>   )r   r   r   rC   r   r   r   delete_moviec   s    rG   movie_iduser_idNc                    sl   t tj||djdd}| |I dH }|jdkr4| tttj	|kjtj
d dI dH  dS dS )zBKo'rish statistikasini saqlash (takroriy ko'rishlar hisoblanmaydi))rH   rI   uq_movie_views_user_movie)
constraintNr      )r-   )	pg_insertr   valueson_conflict_do_nothingr   rowcountr   r   r   idr-   )r   rH   rI   stmtr   r   r   r   record_viewn   s    

rS   Tonly_activec                    s   t t}|r|tjdk}| t t | I dH }|	 }| |
ttj||I dH }t|  |fS )z$Admin uchun: barcha kinolar ro'yxatiTN)r   r   r   r   r   r   r(   r)   r*   r+   r,   r
   
created_atr!   r"   r0   r.   r/   )r   r!   r"   rT   base_qr3   r4   r   r   r   r   get_movies_paginated   s   

rW   c                    sP   |  tttjdkttj|	t
tjI dH }t|  S )zEng ko'p ko'rilgan kinolarTN)r   r   r   r   r   r,   r
   r-   r!   r   r   r   r0   r.   r/   )r   r!   r   r   r   r   get_top_movies   s   
rX   )r   r   )r   r   T)r   )!r   r   typingr   r   
sqlalchemyr   r   r   r	   r
   sqlalchemy.dialects.postgresqlr   rM   sqlalchemy.ext.asyncior   sqlalchemy.ormr   bot.database.modelsr   r   r   strr   inttupler6   boolrF   rG   rS   rW   rX   r   r   r   r   <module>   s|    
'

&

