
    Ii!&                     (    d dl Z d dlZ G d d      Zy)    Nc                   X    e Zd ZddZd ZddZddZddZddZddZ	d	 Z
dd
ZddZy)SharePointClientNc                    t         j                  j                  d      | _        t         j                  j                  d      | _        t         j                  j                  d      | _        t         j                  j                  d      | _        |r|| _        n| j                         | _        d| j                   | _	        i | _
        y )NSHAREPOINT_TENANT_IDSHAREPOINT_CLIENT_IDSHAREPOINT_CLIENT_SECRETSHAREPOINT_SITE_IDz'https://graph.microsoft.com/v1.0/sites/)osenvironget	tenant_id	client_idclient_secretsite_idaccess_tokenauthenticatebase_url_drive_id_cache)selfr   s     =/srv/www/ollama/chat-ollama/src/services/sharepoint_client.py__init__zSharePointClient.__init__   s    (>?(>?ZZ^^,FGzz~~&:; ,D $ 1 1 3DA$,,P!    c           
      H   d| j                    d}d| j                  | j                  dd}t        j                  ||      }	 |j                          |j                         j                  d      S # t        $ r%}ddlm}  |d	d d
dt        |       d         d }~ww xY w)Nz"https://login.microsoftonline.com/z/oauth2/v2.0/tokenclient_credentialsz$https://graph.microsoft.com/.default)
grant_typer   r   scope)datar   )send_discord_audit_logu   Falha de integração externa
SharePointz"Erro ao autenticar no SharePoint: )actionuser_idobject_typedetails
ip_addressr   )r   r   r   requestspostraise_for_status	Exceptionsrc.discord.discord_webhookr   strjsonr   )r   urlr   responseer   s         r   r   zSharePointClient.authenticate   s    24>>2BBTU.!//;	
 ==40	%%' }}"">22  		J"6(<SVHE 		s   A3 3	B!< BB!c                    |j                         dk(  ry|g}|j                         dk(  r|j                  d       n$|j                         dk(  r|j                  d       || j                  v r| j                  |   S | j                         }|D ]"  }|d   |v s|d   | j                  |<   |d   c S  t	        d| d	      )
NarquivoszBb!PvwXRPMJ2Uq5bxWxWWiZaS97wielQ81DqAQaRqwAs0ORcYqmkhe7Q6bSFIrkDPZY
documentoszDocumentos CompartilhadosArquivosnameidzDrive 'u(   ' não encontrado no site do SharePoint.)lowerappendr   
get_drivesr(   )r   
drive_namepossible_namesdrivesdrives        r   get_drive_id_by_namez%SharePointClient.get_drive_id_by_name(   s    +W$-!!"=>:-!!*----''
33" 	#EV}.38;$$Z0T{"	# '*-UVWWr   c                     | j                  |      }dd| j                   i}|r
d| d| d}nd| d}t        j                  ||      }|j	                          |j                         S )zTLista arquivos/pastas a partir da biblioteca 'Arquivos' (ou outra, se especificado).AuthorizationBearer (https://graph.microsoft.com/v1.0/drives//root:/
:/children/root/childrenheaders)r<   r   r%   r   r'   r+   )r   pathr8   drive_idrE   r,   resps          r   
list_fileszSharePointClient.list_files9   sx    ,,Z8"gd.?.?-@$AB<XJgdVS]^C<XJnUC||C1yy{r   c                     dd| j                    i}d}|r|d| z  }t        j                  ||      }|j                          |j	                         S )Nr>   r?   z&https://graph.microsoft.com/v1.0/sitesz?search=rD   )r   r%   r   r'   r+   )r   searchrE   r,   r-   s        r   
list_siteszSharePointClient.list_sitesE   s[    "gd.?.?-@$AB6XfX&&C<<W5!!#}}r   c           
      R   |
t               }||kD  st        |      |kD  ry 	 | j                  ||      j                  dg       }|D ]x  }	|	j                  d      s||	d   f}
|
|v r!|j                  |
       |r
| d|	d    n|	d   }t        d|        |	d   j                         |j                         k(  sv|c S  |D ]R  }	|	j                  d      s||	d   f}
|
|v r!|r
| d|	d    n|	d   }| j                  |||dz   ||||      }|sP|c S  y # t        $ r Y y w xY w)	Nr8   valuefolderr3   /z+[DEBUG][FOLDER-RECURSIVE] Visitando pasta:    )r8   _visited_max_visited)	setlenrI   r   r(   addprintr5   find_folder_recursive)r   folder_namecurrent_pathdepth	max_depthr8   rS   rT   itemsitem	folder_idcaminho_atualsub_pathfounds                 r   rY   z&SharePointClient.find_folder_recursiveN   s   uH9H <	OOLZOHLLWVXYE  		)Dxx!)4<8	(Y'DP<.$v, @VZ[aVbCM?ST<%%';+<+<+>>((		)  	!Dxx!)4<8	(?Kl^1T&\N;QUV\Q]22;%PQ'S\is  G  Vb2  c L	! +  		s   #D 	D&%D&c	                    dd l }	|
t               }||kD  st        |      |kD  rd g fS 	 | j                  ||      j	                  dg       }
|
D cg c]  }|j	                  d      s|d    }}|	j                  ||d|      }|
D ]d  }|j	                  d      s||d   f}||v r!|j                  |       |r
| d|d    n|d   }t        d	|        |sT|d   |d   k(  s`||fc S  |
D ]X  }|j	                  d      s||d   f}||v r!|r
| d|d    n|d   }| j                  |||d
z   |||||      \  }}|sT||fc S  d |fS # t
        $ r d g fcY S w xY wc c}w )Nr   rN   rO   rP   r3      )ncutoffrQ   z'[DEBUG][FOLDER-FUZZY] Visitando pasta: rR   )r8   	min_ratiorS   rT   )
difflibrU   rV   rI   r   r(   get_close_matchesrW   rX   find_folder_fuzzy)r   rZ   r[   r\   r]   r8   rh   rS   rT   ri   r^   r_   folder_namesmatchesr`   ra   rb   rc   suggestionss                      r   rk   z"SharePointClient.find_folder_fuzzyl   s   uH9H <8O	OOLZOHLLWVXYE 27M$((8:LVMM++KS\+] 		2Dxx!)4<8	(Y'DP<.$v, @VZ[aVb?OPtF|wqz9('11		2  	.Dxx!)4<8	(?Kl^1T&\N;QUV\Q]%)%;%;KSXYZSZ\er|  IR  ]e  t@%;  &A"{ +--	. \!!/  	8O	Ms   #E E"'E"EEc                 z   dd| j                    i}| j                   d}t        j                  ||      }|j	                          |j                         j                  dg       }t        d       |D ]C  }t        d|j                  d       d	|j                  d
       d|j                  d              E |S )Nr>   r?   z/drivesrD   rO   u2   [DEBUG] Drives disponíveis no site do SharePoint:z  - id: r4   z, name: r3   z, displayName: displayName)r   r   r%   r   r'   r+   rX   )r   rE   r,   rH   r:   r;   s         r   r7   zSharePointClient.get_drives   s    "gd.?.?-@$ABw'||C1"-BC 	tEHUYYt_-Xeii6G5HX]XaXaboXpWqrs	tr   c           	         | j                  |      }dd| j                   i}|r
d| d| d}nd| d}t        j                  ||      }|j	                          |j                         j                  dg       }	g }
d	|z  }|	D ]  }|j                  d
      rX|
j                  | d|d           ||k  s3|r
| d|d    n|d   }|
j                  | j                  |||dz   |             l|
j                  | d|d            |
S )u   
        Lista recursivamente todos os arquivos e pastas a partir de um caminho, formatando como árvore com indentação.
        r>   r?   r@   rA   rB   rC   rD   rO   z  rP   u   📁 r3   rQ   rR   )r8   levelr]   u   📄 )	r<   r   r%   r   r'   r+   r6   extend	list_tree)r   rF   r8   rr   r]   rG   rE   r,   rH   r^   linesindentr_   rb   s                 r   rt   zSharePointClient.list_tree   s3    ,,Z8"gd.?.?-@$AB<XJgdVS]^C<XJnUC||C1		, 	=Dxx!xuT&\N;<9$;?$qf7T&\HLLZW\]^W^js!tuxuT&\N;<	= r   c                 V   ddl }| j                  |      }dd| j                   i}d| d| d}t        j                  ||      }|j                          |j                  j	                  d	d
      }d|v s|j                         j                  d      r|j                  S |j                         j                  d      rUddl
m}	 |j                  |j                        }
 |	|
      }d
}|j                  D ]  }||j                         xs d
z  } |S |j                         j                  d      ra	 ddl}ddlm} |j                  |j                        } ||      }dj'                  |j(                  D cg c]  }|j                   c}      S y# t"        $ r Y yw xY wc c}w )u   
        Baixa o conteúdo de um arquivo do SharePoint pelo caminho relativo (ex: 'Sao Paulo/RH/arquivo.txt').
        Suporta arquivos de texto, PDF e DOCX (retorna texto extraído).
        r   Nr>   r?   r@   rA   z	:/contentrD   zContent-Type textz.txtz.pdf)	PdfReaderz.docxu   [docx2txt não instalado])Document
u:   [Tipo de arquivo não suportado para leitura de conteúdo])ior<   r   r%   r   r'   rE   r5   endswithry   PyPDF2rz   BytesIOcontentpagesextract_textdocxImportErrorr{   join
paragraphs)r   	file_pathr8   r}   rG   rE   r,   rH   content_typerz   	pdf_bytesreaderry   pager   r{   	doc_bytesdocps                      r   get_file_contentz!SharePointClient.get_file_content   s   
 	,,Z8"gd.?.?-@$AB8
')T]^||C1||'';\!Y__%6%?%?%G99__''/(

4<<0Iy)FD 2))+1r12K__''03 &

4<<0I9%C99cnn=aff=>>O  323
 >s   6F <F&	F#"F#)N)r2   )Nr2   )Nr      r2   N  )Nr   r   r2   gffffff?Nr   )Nr2   r   r   )__name__
__module____qualname__r   r   r<   rI   rL   rY   rk   r7   rt   r    r   r   r   r      s7    
"3.X"
<"B	2 Pr   r   )r%   r
   r   r   r   r   <module>r      s     	MP MPr   