U
    1i                     @  s   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ e	e jjjZeG dd dZeG d	d
 d
ZeG dd dZeG dd dZdddddddZdS )z@Configuration loading from config.json and .env with validation.    )annotationsN)	dataclassfield)Path)load_dotenvc                   @  s&   e Zd ZU ded< ded< ded< dS )
SiteConfigstrproperty_urldisplay_name	list[str]sitemap_urlsN__name__
__module____qualname____annotations__ r   r   //opt/web_system/seo_auto/src/config/settings.pyr      s   
r   c                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )	KPIThresholdsint
min_clicksmin_impressionsfloatmin_ctrmax_positionmin_index_rateNr   r   r   r   r   r      s
   
r   c                   @  s   e Zd ZU dZded< dZded< dZded< dZded< dZded	< e	e
d
Zded< dZded< dZded< eddddZdS )EmailConfig r   	smtp_hostiK  r   	smtp_port	smtp_usersmtp_password
email_from)default_factoryr   email_tosendgrid_api_keysendgrid_frombool)returnc                 C  s
   t | jS )N)r'   r%   )selfr   r   r   use_sendgrid*   s    zEmailConfig.use_sendgridN)r   r   r   r   r   r   r    r!   r"   r   listr$   r%   r&   propertyr*   r   r   r   r   r      s   
r   c                   @  sV   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< ded< dS )Settingszlist[SiteConfig]sitesr   kpi_thresholdsr   tracked_keywordsr   keyword_alert_thresholdurl_inspection_sample_sizeexecution_timeout_hoursmax_sitemap_resubmit_retriesr   service_account_key_pathr   emailNr   r   r   r   r   r-   /   s   
r-   z
str | None)config_pathenv_pathr(   c                 C  s  |dkrt td }t| | dkr0t td } t| ddd}t|}W 5 Q R X dD ]}||krXtd| qXd	d
 |d D }|std|d }t|d |d |d |d |d d}t	dt td d }t	dd}	dd
 |	
dD }
tt	ddtt	ddt	ddt	d dt	d!d|
t	d"dt	d#dd$}t|||d%g |d&d'|d(d)|d*d'|d+d'||d,	S )-z5Load and validate settings from config.json and .env.Nz.envzconfig.jsonrzutf-8)encoding)r.   r/   r0   zMissing required config key: c              	   S  s*   g | ]"}t |d  |d |dg dqS )r	   r
   r   )r	   r
   r   )r   get).0sr   r   r   
<listcomp>P   s   
z!load_settings.<locals>.<listcomp>r.   z$At least one site must be configuredr/   r   r   r   r   r   )r   r   r   r   r   ZGOOGLE_SERVICE_ACCOUNT_KEY_PATHcredentialszservice_account.jsonZEMAIL_TOr   c                 S  s   g | ]}|  r|  qS r   )strip)r<   er   r   r   r>   l   s      ,Z	SMTP_HOSTzsmtp.gmail.comZ	SMTP_PORTZ587Z	SMTP_USERZSMTP_PASSWORDZ
EMAIL_FROMZSENDGRID_API_KEYZSENDGRID_FROM)r   r   r    r!   r"   r$   r%   r&   r0   r1      r2   2   r3   r4   )	r.   r/   r0   r1   r2   r3   r4   r5   r6   )r   PROJECT_ROOTr   openjsonload
ValueErrorr   osgetenvsplitr   r   r-   r;   )r7   r8   fZcfgkeyr.   Zktr/   Zsa_key_pathZemail_to_rawr$   r6   r   r   r   load_settings<   sd    	










rO   )NN)__doc__
__future__r   rG   rJ   Zdataclassesr   r   pathlibr   Zdotenvr   __file__ZresolveparentrE   r   r   r   r-   rO   r   r   r   r   <module>   s$     