o
    i                     @   sV  d dl Z d dlZd dl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 e dZe dZe d	Ze d
Ze dZe dZe dZe dZedZer`er`esdedee Zdd ZdedefddZdedefddZedddfdefddZd e	fd!d"Z d#efd$d%Z!d&efd'd(Z"d#efd)d*Z#dS )+    N)
DictCursor)HTTPExceptionDependsHeader)datetime)timezone)FernetAPP_KEYAPI_KEYSESSION_KEYZPOSTGRES_HOSTZPOSTGRES_PORTZPOSTGRES_DBZPOSTGRES_USERZPOSTGRES_PASSWORDzAmerica/Sao_PaulouA   As variáveis APP_KEY, API_KEY e SESSION_KEY devem ser definidas.c               
   C   sL   zt jtttttdW S  t jy% }  ztd|   t	dddd } ~ ww )N)dbnameuserpasswordhostportz$Erro ao conectar ao banco de dados: i  u)   Serviço de banco de dados indisponível.status_codedetail)
psycopg2connectDB_NAMEDB_USERDB_PASSDB_HOSTDB_PORTOperationalErrorprintr   )e r   /app/bootstrap.pyget_db_connection   s   r    datareturnc                 C      t |   S N)fernetZencryptencodedecode)r!   r   r   r   encrypt_data        r(   encrypted_datac                 C   r#   r$   )r%   Zdecryptr&   r'   )r*   r   r   r   decrypt_data!   r)   r+   .zChave de API.)description	x_api_keyc                    s   | t krtdddd S )Ni  u"   Chave de API inválida ou ausente.r   )r
   r   )r-   r   r   r   verify_api_key#   s   r.   dtc                 C   s   t | ts| S | tS )us   
    Um filtro Jinja2 para converter um datetime com fuso horário UTC
    para o fuso horário de São Paulo.
    )
isinstancer   
astimezoneSAO_PAULO_TZ)r/   r   r   r   to_sao_paulo_time'   s   

r3   cookie_stringc                 C   sZ  z}t dd | dD d }|stdtj|ddid}|d}|d	}|d
}t|||gs7tdtj|t	d}t
| }t }z3| }	d}
|	|
||||tt	f |  W d    n1 siw   Y  d|dW |  W S |  w  ttjfy } ztdt|dd }~w ty } ztd|  tdddd }~ww )Nc                 s   (    | ]}| d r|dd V  qdS zfgtsd_token==   N
startswithsplit.0sr   r   r   	<genexpr>3      & z)register_session_logic.<locals>.<genexpr>; 8   O 'fgtsd_token' não foi encontrado na string de cookie.verify_signatureFoptionscnpjZ	cnpj_nomeexp(   JWT inválido. Faltam campos essenciais.tza  
                    INSERT INTO sessoes_fgts (cnpj, nome_empresa, cookies_completos, expira_em, status, ultima_renovacao)
                    VALUES (%s, %s, %s, %s, 'ativo', %s) ON CONFLICT (cnpj) DO UPDATE SET
                        nome_empresa = EXCLUDED.nome_empresa, cookies_completos = EXCLUDED.cookies_completos,
                        expira_em = EXCLUDED.expira_em, status = 'ativo', ultima_renovacao = EXCLUDED.ultima_renovacao, observacoes = NULL;
                sucessostatusrF     r   Erro inesperado no registro:   $Ocorreu um erro interno no servidor.)nextr;   
ValueErrorjwtr'   getallr   fromtimestampr2   r(   r    cursorexecutenowcommitclose
PyJWTErrorr   str	Exceptionr   )r4   fgtsd_token_strdecoded_tokenrF   nome_empresaexp_timestampexp_datetimeencrypted_cookieconncurqueryr   r   r   r   register_session_logic1   s:   





	ri   rF   c                 C   sx   t  }z3|jtd}|d| f | }W d    n1 s w   Y  |s.W |  d S |d W |  S |  w )N)cursor_factoryz+SELECT * FROM sessoes_fgts WHERE cnpj = %s;id)r    rX   r   rY   fetchoner\   )rF   rf   rg   session_datar   r   r   get_session_by_cnpj_apiV   s   
rn   c                 C   s|  zt dd | dD d }|stdtd}|d u r"tddd|}tj|d	d
id}|d}|d}|d}t|||gsGtdt	j
|td}t| }	t }
z4|
 }d}||||||	|t	tf |
  W d    n1 szw   Y  d|dW |
  W S |
  w  ttjfy } ztdt|dd }~w ty } ztd|  tdddd }~ww )Nc                 s   r5   r6   r9   r<   r   r   r   r?   e   r@   z2register_customer_session_logic.<locals>.<genexpr>rA   rB   Z36497467000136i  uN   Sessão da contabilidade não encontrada. É necessário fazer login primeiro.r   rC   FrD   zfgtsdigital.gov.br/ni_perfilzfgtsdigital.gov.br/nome_perfilrG   rH   rI   a  
                    INSERT INTO customer_sessoes_fgts 
                    (id_contabilidade, cnpj, nome_empresa, cookies_completos, expira_em, status, ultima_renovacao)
                    VALUES (%s, %s, %s, %s, %s, 'ativo', %s) 
                    ON CONFLICT (id_contabilidade, cnpj) DO UPDATE SET
                        nome_empresa = EXCLUDED.nome_empresa,
                        cookies_completos = EXCLUDED.cookies_completos,
                        expira_em = EXCLUDED.expira_em,
                        status = 'ativo',
                        ultima_renovacao = EXCLUDED.ultima_renovacao,
                        observacoes = NULL;
                rK   rL   rN   rO   rP   rQ   )rR   r;   rS   rn   r   rT   r'   rU   rV   r   rW   r2   r(   r    rX   rY   rZ   r[   r\   r]   r^   r_   r   )r4   r`   Z
session_idZid_contabilidadera   rF   rb   rc   rd   re   rf   rg   rh   r   r   r   r   register_customer_session_logicb   sF   





ro   )$osrT   r   psycopg2.extrasr   fastapir   r   r   r   Zpytzr   Zcryptography.fernetr   getenvr	   r
   r   r   r   r   r   r   r2   rS   r&   r%   r    r^   r(   r+   r.   r3   ri   rn   ro   r   r   r   r   <module>   s8    








%