o
    i                     @   s   d dl mZmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlZd dlmZmZ d dl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 edZeddZeejjd< G dd dZej ejj!d< dS )    )RequestHTTPException)RedirectResponseJSONResponse)Jinja2Templates)
DictCursor)ListTupleN)get_db_connectionto_sao_paulo_time)register_session_logicdecrypt_data)timezone)datetime)EncryptionService)r   ResponsezAmerica/Sao_Paulo	templates)	directoryr   c                   @   s   e Zd ZeddededefddZededeeeef  fdd	Z	edefd
dZ
dedefddZdededefddZdedefddZdS )PanelControllersuccessrequestmessagecategoryc                 C   s,   d| j vr
g | j d< | j d ||f dS )u'   Adiciona uma mensagem flash à sessão.	_messagesN)sessionappend)r   r   r    r   /app/controllers/panel.pyflash   s   

zPanelController.flashreturnc                 C   s   d| j v r| j dS g S )u/   Retorna e remove as mensagens flash da sessão.r   )r   pop)r   r   r   r   get_flashed_messages    s   z$PanelController.get_flashed_messagesc                 C   sz   t  }z4|jtd}|d | }td| |dW  d   W |  S 1 s,w   Y  W |  dS |  w )u:   Retorna todas as sessões ordenadas por data de criação.cursor_factoryz1SELECT * FROM companies ORDER BY created_at DESC;zdashboard.html)r   sessionsN)r
   cursorr   executefetchallr   TemplateResponseclose)r   conncurr$   r   r   r   get_all_sessions%   s   

z PanelController.get_all_sessionscookiec                 C   s  zt dd |dD d }|stdtj|ddid}|d}|d	}|d
}t|||gs7tdt|ts@tdt|t	t
fsKtdtj|td}t|}	t }
zC|
 /}d}|||||	|ttf |
  | |dd tdddW  d    W |
  W S 1 sw   Y  W |
  W d 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   s(    | ]}| d r|dd V  qdS )zfgtsd_token==   N)
startswithsplit).0sr   r   r   	<genexpr>3   s   & z(PanelController.store.<locals>.<genexpr>z; u8   O 'fgtsd_token' não foi encontrado na string de cookie.verify_signatureF)optionscnpj	cnpj_nomeexpu(   JWT inválido. Faltam campos essenciais.u!   CNPJ deve ser uma string válida.u5   Timestamp de expiração deve ser um número válido.)tza  
                        INSERT INTO companies (cnpj, name, cookie, expires_on, status, updated_at)
                        VALUES (%s, %s, %s, %s, 'active', %s) ON CONFLICT (cnpj) DO UPDATE SET
                            name = EXCLUDED.name, cookie = EXCLUDED.cookie,
                            expires_on = EXCLUDED.expires_on, status = 'active', updated_at = EXCLUDED.updated_at, details = NULL;
                    u*   Sessão registrada/atualizada com sucesso!r   /panel/  urlstatus_codei  )r?   detailzErro inesperado no registro:   z$Ocorreu um erro interno no servidor.)nextr1   
ValueErrorjwtdecodegetall
isinstancestrintfloatr   fromtimestampSAO_PAULO_TZr   encrypt_datar
   r%   r&   nowcommitr   r   r)   
PyJWTErrorr   	Exceptionprint)selfr   r-   fgtsd_token_strdecoded_tokenr7   nameexp_timestampexp_datetimeencrypted_cookier*   r+   queryer   r   r   store1   sH   






zPanelController.storer7   c              
   C   s   t  }z`z=| /}|d|f |  |jdkr&| |d| dd n| |d| dd W d	   n1 s;w   Y  W n ty] } z| |d
| d W Y d	}~nd	}~ww W |  n|  w tdddS )u   Remove uma sessão pelo CNPJ.z&DELETE FROM companies WHERE cnpj = %s;r   u   Sessão do CNPJ z removida com sucesso.r   u'   Nenhuma sessão encontrada para o CNPJ .warningNu   Erro ao remover sessão: dangerr;   r<   r=   )	r
   r%   r&   rP   rowcountr   rR   r)   r   )rT   r   r7   r*   r+   r\   r   r   r   delete_session]   s$   

 zPanelController.delete_sessionc              
   C   s   t  }zfzD|jtd}|d|f | }W d   n1 s!w   Y  |s6tddiddW W |  S t|d }td	|id
W W |  S  tyi } ztdt	|iddW  Y d}~W |  S d}~ww |  w )z>Busca um cookie pelo CNPJ, descriptografa e retorna como JSON.r"   z-SELECT cookie FROM companies WHERE cnpj = %s;Nerroru   CNPJ não encontradoi  )contentr?   r-   decrypted_cookie)rd   rA   )
r
   r%   r   r&   fetchoner   r)   r   rR   rI   )rT   r7   r*   r+   session_datare   r\   r   r   r   get_decrypted_cookier   s$   


 

z$PanelController.get_decrypted_cookieN)r   )__name__
__module____qualname__staticmethodr   rI   r   r   r	   r!   r,   r]   r   rb   r   rh   r   r   r   r   r      s     ,r   r!   )"fastapir   r   fastapi.responsesr   r   fastapi.templatingr   psycopg2.extrasr   typingr   r	   rD   utilsr
   r   	bootstrapr   r   pytzr   r   Zservices.encryptionr   Zmodels.panelr   rM   r   envfiltersr   r!   globalsr   r   r   r   <module>   s"    
n