o
    i                     @   sZ   d dl m Z mZmZ d dlmZ d dlZd dlZd dlmZ d dl	m
Z
 G dd dZdS )    )datetimetimezone	timedelta)HTTPExceptionN)EncryptionService)
FgtsClientc                   @   s&   e Zd Zdd ZdedefddZdS )SessionServicec                 C   s   || _ t | _t | _d S )N)connr   cryptor   fgts)selfdb_conn r   /app/services/session.py__init__	   s   zSessionService.__init__company_cnpjcustomer_cnpjc                 C   s  | j  }d}||||f | }|stddd|\}}}}	}
ttj}|
rT|rT|	rT|	|t	dd krT| j
|}d|vrI| d| }||	fW  d    S | j
|}z
| jj||d	}W n ty{ } ztd
dt| dd }~ww |d  d| |d< | j
|d }|d }|d }tdd |dD d }|stdtj|ddid}|d }|
rd}|||||
f nd}|||||||f | j   |d |fW  d    S 1 sw   Y  d S )Na  
                SELECT 
                    co.id, co.cookie, 
                    cu.cookie, cu.expires_on, cu.id
                FROM companies co
                LEFT JOIN customers cu ON (cu.company_id = co.id AND cu.cnpj = %s)
                WHERE co.cnpj = %s
            i  u,   Empresa Contábil (Company) não encontrada.)status_codedetail   )minuteszfgtsd_ni_usuario=z; fgtsd_ni_usuario=)Zcompany_cookie_decryptedr   i  u2   Falha ao obter sessão. Verifique a procuração: cookie
expires_onc                 s   s(    | ]}| d r|dd V  qdS )zfgtsd_token==   N)
startswithsplit).0sr   r   r   	<genexpr>G   s   & z6SessionService.get_customer_session.<locals>.<genexpr>z; u8   O 'fgtsd_token' não foi encontrado na string de cookie.verify_signatureF)optionszfgtsdigital.gov.br/nome_perfilz
                    UPDATE customers 
                    SET cookie = %s, expires_on = %s, updated_at = NOW(), status = 'active'
                    WHERE id = %s
                z
                    INSERT INTO customers (company_id, cnpj, name, cookie, expires_on, status, created_at)
                    VALUES (%s, %s, %s, %s, %s, 'active', NOW())
                )r	   cursorexecutefetchoner   r   nowr   utcr   r
   decrypt_datar   Zswap_context	Exceptionstrencrypt_datanextr   
ValueErrorjwtdecodecommit)r   r   r   curqueryresultZ
company_idZcompany_cookieZcustomer_cookieZcustomer_expires_onZcustomer_idZnow_utcdecrypted_cookieZraw_company_cookieZnew_session_dataeZnew_cookie_encZnew_expires_onr   fgtsd_token_strdecoded_tokenZcustomer_nameZ
update_sqlZ
insert_sqlr   r   r   get_customer_session   sT   !


$z#SessionService.get_customer_sessionN)__name__
__module____qualname__r   r)   r7   r   r   r   r   r      s    r   )r   r   r   fastapir   r-   psycopg2services.encryptionr   Zservices.fgts_clientr   r   r   r   r   r   <module>   s    