
    #;iuD              
       L   d dl mZmZmZ d dlmZ d dlmZ d dl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mZmZmZmZ d d	lmZ  ed
dg      Z G d de      Z G d de      Z G d de      Zej?                  de	e          ee       ee      fdedefd       Z ejC                  ded       ee       ee      fdededefd       Z"ejG                  de       ee       ee      fde$dededefd       Z%ejM                  d       ee       ee      fde$dedefd       Z'dede$d e(d!e$d"e)f
d#Z*ej?                  d$e
e(e	e(   f          ee       ee      fdedefd%       Z+ej?                  d&       ee       ee      fd e(dedefd'       Z,y())    )	APIRouterDependsHTTPException)Session)and_)ListDictAny)datetime)	BaseModel)get_db)UserCustomTriggerUserIndustryTemplateIndustryTemplateRecurringScheduleRule	ChainStep)get_current_userz/custom-triggerszcustom-triggers)prefixtagsc                   x    e Zd ZU dZeed<   eed<   eed<   edz  ed<   edz  ed<   eed<   eed	<    G d
 d      Z	y)CustomTriggerOutu!   Кастомный триггерidnamedisplay_nameNdescriptioncategory	is_active
created_atc                       e Zd ZdZy)CustomTriggerOut.ConfigTN)__name__
__module____qualname__from_attributes     1/var/www/notifications/app/api/custom_triggers.pyConfigr"      s    r(   r*   )
r#   r$   r%   __doc__int__annotations__strboolr   r*   r'   r(   r)   r   r      s>    +G
ItDjO r(   r   c                   N    e Zd ZU dZeed<   eed<   dZedz  ed<   dZedz  ed<   y)CreateCustomTriggerRequestuH   Запрос на создание кастомного триггераr   r   Nr   r   )r#   r$   r%   r+   r.   r-   r   r   r'   r(   r)   r1   r1      s,    R
I"Kt"HcDjr(   r1   c                   b    e Zd ZU dZdZedz  ed<   dZedz  ed<   dZedz  ed<   dZ	e
dz  ed<   y)UpdateCustomTriggerRequestuL   Запрос на обновление кастомного триггераNr   r   r   r   )r#   r$   r%   r+   r   r.   r-   r   r   r   r/   r'   r(   r)   r3   r3   &   s=    V#L#*#"Kt"HcDj!Itd{!r(   r3    )response_modelcurrent_userdbc                     |j                  t              j                  t        j                  | j                  k(        j	                  t        j
                  j                               j                         }|S )u\   Получить список кастомных триггеров пользователя)queryr   filter	tenant_idorder_byr    descall)r6   r7   triggerss      r)   list_custom_triggersr@   0   sZ     xx&--<#9#99h}'',,./  Or(      )r5   status_coderequestc                    |j                  t              j                  t        t        j                  |j                  k(  t        j
                  | j
                  k(              j                         }|rt        dd| j
                   d      t        |j                  | j
                  | j                  | j                  | j                  d      }|j                  |       |j                          |j                  |       |S )u0   Создать кастомный триггер  u    Триггер с именем 'u   ' уже существуетrB   detailT)r;   r   r   r   r   r   )r9   r   r:   r   r;   r   firstr   r   r   r   addcommitrefresh)rC   r6   r7   existingtriggers        r)   create_custom_triggerrN   =   s     xx&--##|'='==',,.	

 eg  5gll^C`a
 	
 ((\\))''!!G FF7OIIKJJwNr(   z/{trigger_id}
trigger_idc                 P   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      |j                  |j                  |_        |j                  |j                  |_	        |j                  |j                  |_
        |j                  |j                  |_        t        j                         |_        |j                          |j!                  |       |S )u2   Обновить кастомный триггер      Триггер не найденrF   )r9   r   r:   r   r   r;   rH   r   r   r   r   r   r   utcnow
updated_atrJ   rK   )rO   rC   r6   r7   rM   s        r)   update_custom_triggerrU   d   s     hh}%,,
*##|'='==	

 eg  4VWW '&33&%11#"++$#--!*GIIKJJwNr(   c                    |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      t        ||j                  |j                  |j
                        }|d   r"g }|d   d   r/t        |d   d         }|j                  d| d|d	kD  rd
nd        |d   d   r/t        |d   d         }|j                  d| d|d	kD  rdnd        |d   d   r/t        |d   d         }|j                  d| d|d	kD  rd
nd        |d   d   r0t        |d   d         }|j                  d| d|d	kD  rd
nd d       d|j                   ddj                  |      z   dz   }t        d||d   |j                  d      |j                  |       |j                          dddS )u0   Удалить кастомный триггерrQ   rR   rF   is_useddetailsuser_templatesu   используется в u    шаблон   u   ахu   еrecurring_schedulesu    расписаниu   яхu   иrulesu    правилchain_stepsu    шагu    цепочкиu4   Невозможно удалить триггер 'z': z, .rE   )messageusagetrigger_nameTu   Триггер удалён)successr_   )r9   r   r:   r   r   r;   rH   r   check_trigger_usager   lenappendr   joindeleterJ   )rO   r6   r7   rM   
usage_infousage_messagescountr_   s           r)   delete_custom_triggerrk      sI    hh}%,,
*##|'='==	

 eg  4VWW %RW\\<CYCYZJ)i !12
9-.>?@E!!$@}_dgh_hU[nrTs"tui !67
9-.CDEE!!$@GZejmnen[atxZy"z{i )
9-g67E!!$@}_dgh_hU[nrTs"tui /
9-m<=E!!$@wY^abYbvhlNmm|"}~HI]I]H^^abeieneno}e~~  BE  E "#I. ' 4 4
 	
 IIgIIK(EFFr(   ra   r;   returnc                   
 g g g g d}| j                  t              j                  t        j                  |k(        j	                         }|r|D cg c]  }|j
                   }}| j                  t              j                  t        j                  |k(  t        j                  j                  |            j	                         }|D ]U  
t        
fd|D        d      }	|d   j                  
j
                  
j                  xs |	r|	j                  nddd       W |d   r|d   D 
cg c]  }
|
d   	 }}
| j                  t              j                  t        j                  |k(  t        j                  j                  |            j	                         }|D ].  }|d	   j                  |j
                  |j                  d
d       0 |d   r|d   D 
cg c]  }
|
d   	 }}
| j                  t               j                  t         j                  |k(  t         j                  j                  |            j	                         }|D ].  }|d   j                  |j
                  |j                  dd       0 |d   r|d   D 
cg c]  }
|
d   	 }}
| j                  t"              j                  t"        j                  j                  |            j	                         }|D ]9  }|d   j                  |j
                  |j$                  |j&                  dd       ; t)        |d         dkD  xs7 t)        |d	         dkD  xs$ t)        |d         dkD  xs t)        |d         dkD  }||dS c c}w c c}
w c c}
w c c}
w )u  
    Проверяет, используется ли триггер в различных местах системы.
    
    Args:
        db: Сессия базы данных
        trigger_id: ID триггера
        trigger_name: Имя триггера (например, "custom.appointment.cancelled")
        tenant_id: ID тенанта
        
    Returns:
        Словарь с информацией об использовании:
        {
            "is_used": bool,
            "details": {
                "user_templates": [...],
                "recurring_schedules": [...],
                "rules": [...],
                "chain_steps": [...]
            }
        }
    )rY   r[   r\   r]   c              3   V   K   | ]   }|j                   j                  k(  s| " y w)N)r   industry_template_id).0ituts     r)   	<genexpr>z&check_trigger_usage.<locals>.<genexpr>   s#     %jRRTRiRiIib%js   ))NrY   u   Неизвестноuser_template)r   r   typer   r[   recurring_scheduler\   ruler]   
chain_step)r   chain_idorderru   r   )rW   rX   )r9   r   r:   trigger_typer>   r   r   r;   ro   in_nextre   custom_namer   r   user_template_idr   r   ry   rz   rd   )r7   rO   ra   r;   usage_detailsindustry_templatesrq   industry_template_idsrY   industry_templaterr   user_template_idsr[   rsr\   rw   r]   csrW   s             `        r)   rc   rc      s   . !	M "23::%%5	ce  1C D2 D D"67>> **i7 5599:OP
 #% 	
 ! 	B $%j3E%jlp q*+22eesEV+<+A+A\r'4 	 %&0=>N0OP"RXPP hh'89@@''94..223DE
 #% 	
 & 	B/077ee,9 	 %&0=>N0OP"RXPP%%NNi'!!%%&78
 #% 	
  	D'"))gg		+ 	 %&0=>N0OP"RXPPhhy)00&&**+<=

#% 	  	B-(//eeKK$	1 	 	M*+,q0 	.M/01A5	.M'"#a'	. 	M-()A-	    G !E  Q Q Qs   M4.M9M>
Nz
/availablec                    g dg dg dg dg dddgd}|j                  t              j                  t        t        j                  | j                  k(  t        j
                  d	k(              j                         }|D ]K  }|j                  xs d
}||vrg ||<   |j                  ||   vs.||   j                  |j                         M |S )ug   Получить все доступные триггеры (встроенные + кастомные))appointment.createdappointment.soonappointment.completedappointment.followupzappointment.cancelled)booking.createdbooking.soonbooking.completedzbooking.cancelled)order.createdorder.completedzorder.cancelledzorder.shipped)courier.dispatchedorder.deliveredzdelivery.failed)lesson.soonlesson.startinglesson.completedzlesson.cancelledzmaintenance.duezmaintenance.overdue)appointmentbookingrz   delivery	educationmaintenanceTcustom)
r9   r   r:   r   r;   r   r>   r   r   re   )r6   r7   builtin_triggerscustom_triggersrM   r   s         r)   get_available_triggersr   1  s    





 !
?#L hh}-44##|'='==##t+	

 
ce  # <##/x++)+X&<</99X&--gll;< r(   z/trigger-info/{trigger_name}c                    |j                  t              j                  t        t        j                  |j                  k(  t        j
                  | k(              j                         }|r0|j
                  |j                  |j                  |j                  ddS ddddddddd	d
ddddddddddddddddddddddddddddddddddddddd d!ddd"d#ddd$}| |v r||    }| |d%   |d&   |d'   d(dS t        d)d*+      ),uN   Получить информацию о конкретном триггереT)r   r   r   r   	is_customu$   При создании записиu\   Срабатывает когда создается новая запись на приёмr   )r   r   r   u   Перед приёмомuK   Срабатывает за указанное время до приёмаu   После приёмаuC   Срабатывает после завершения приёмаu   Повторный визитuW   Срабатывает через указанное время после приёмаuK   Срабатывает при создании записи в салонеr   u   Перед визитомu>   Напоминание перед визитом в салонu   После визитаuC   Срабатывает после завершения визитаu$   При создании заказаuH   Срабатывает при создании нового заказаrz   u   Заказ готовuG   Срабатывает когда заказ готов к выдачеu   Курьер выехалuY   Срабатывает когда курьер отправляется к клиентуr   u   ДоставленоuC   Срабатывает после успешной доставкиu   Перед урокомu;   Напоминание перед началом урокаr   u   Урок начинаетсяu>   Срабатывает в момент начала урокаu   После урокаuA   Срабатывает после завершения урока)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   FrQ   rR   rF   )r9   r   r:   r   r;   r   rH   r   r   r   r   )ra   r6   r7   custom_triggerbuiltin_infoinfos         r)   get_trigger_infor   r  s    XXm,33##|'='==,.	

 eg  "''*77)55&//
 	
 Cy% 
 8h%
 6`%"
 <t%!
 Ch!
 8[!
 6`!
 Ce
 4d
 8v"
 3`"
 6X#
 <[#
 4^#
EGLR |#L)  0.Z(
 	
 C0R
SSr(   N)-fastapir   r   r   sqlalchemy.ormr   
sqlalchemyr   typingr   r	   r
   r   pydanticr   app.db.sessionr   app.db.modelsr   r   r   r   r   r   r   app.api.depsr   routerr   r1   r3   getr@   postrN   putr,   rU   rg   rk   r.   dictrc   r   r   r'   r(   r)   <module>r      sv   5 5 "  " "   ! y y y )	,4E3F	Gy    " " Bt$456 !12&/			 7	 R 0cB !!12&/#'## 	# C#L O,<= !!12&/	  '    		  > F  !!12&/8G8G8G 	8G  8GvjG j jC jTW j\` jZ Lc49n)=> !12&/=== ?=@ *+ !!12&/lTlTlT 	lT ,lTr(   