
    ${j                     "   d Z ddlZddlZddlZ ej                  d      ZdZdZ ej                  dd      j                         Z
dZd	ed
eeef   fdZ	 ddeded	ededz  d
eeeef   f
dZ	 	 ddededz  d	ededz  dedz  d
eeeef   fdZy)u  
GoHighLevel (Linkia) API client — Sweet Angels SDR Medio Porte.

Clone do ghl_client.py do sdr_fesqua. Unica diferenca:
DEFAULT_PIPELINE_ID vem de env (LINKIA_PIPELINE_ID_MEDIO_PORTE) porque
o pipeline dessa campanha ainda vai ser criado pelo Renato no Linkia.

Gotchas GHL serverless (ver ghl_integration_gotchas.md):
  - sempre consumir body do fetch (a gente ja consome via r.text).
  - dedupe 400: usar contactId do erro (nao implementado aqui — cabe adicionar
    se comecar a bater 400 duplicate).
  - delay de indexacao de 30-90s: enviar mensagem logo apos criar contato
    pode falhar. Contatos ja existem na lista antes do webhook.
    Nghl_client_medio_portez$https://services.leadconnectorhq.comz
2021-07-28LINKIA_PIPELINE_ID_MEDIO_PORTE zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36tokenreturnc                 (    d|  ddt         t        dS )NzBearer zapplication/json)AuthorizationzContent-TypeAcceptVersionz
User-Agent)GHL_API_VERSION
USER_AGENT)r   s    F/opt/mia/workspace/clientes/sweet_angels/sdr_medio_porte/ghl_client.py_base_headersr   %   s"    "5'**$"      
contact_idmessageconversation_idc                    t          d}t        |      }d| |d}|r||d<   	 t        j                  |||d      }|j                  }|s0t
        j                  d| |j                  |j                  dd	        n!t
        j                  d
| |j                         ||j                  |j                  fS # t        j                  $ r.}	t
        j                  d|	       ddt        |	      fcY d}	~	S d}	~	ww xY w)zl
    Envia mensagem WhatsApp para o contato via API do GHL/Linkia.
    Retorna (ok, status_code, body).
    z/conversations/messagesWhatsApp)type	contactIdr   conversationId   jsonheaderstimeoutz,GHL send failed contact=%s status=%s body=%sN  z GHL send ok contact=%s status=%szGHL send exception: %sFr   )GHL_API_BASEr   requestspostoklogwarningstatus_codetextinfoRequestException	exceptionstr)
r   r   r   r   urlr   payloadrr"   es
             r   send_whatsapp_messager/   /   s     N1
2CE"GG
 $3 ! MM#GWbITTKK>AMM166$3<
 HH7Q]]S1==!&&(($$  .2aQ s   BB4 4C5#C0*C50C5opportunity_idstage_idstatuspipeline_idc           	      6   | sy|syi }|r|xs t         }|sy||d<   ||d<   |r||d<   |syt         d|  }t        |      }	 t        j                  |||d	
      }	|	j
                  }
|
s1t        j                  d| ||	j                  |	j                  dd        n"t        j                  d| ||	j                         |
|	j                  |	j                  fS # t        j                  $ r/}t        j                  d| |       ddt        |      fcY d}~S d}~ww xY w)a  
    Move card de oportunidade para uma etapa e/ou atualiza status via API v2 do GHL.

    - Se `stage_id` for informado, envia `pipelineStageId` no body (a API exige
      tambem `pipelineId`; usa `pipeline_id` recebido ou o DEFAULT_PIPELINE_ID).
    - Se `status` for informado (ex.: 'lost', 'won'), envia `status` no body.
    - Se ambos forem informados, envia num unico PUT.
    - Se nenhum for informado, nao chama a API e retorna (False, 0, 'noop').

    Retorna (ok, status_code, body).
    )Fr   missing_opportunity_id)Fr   missing_token)Fr   missing_pipeline_idpipelineStageId
pipelineIdr2   )Fr   noopz/opportunities/r   r   z?GHL move opportunity failed opp=%s payload=%s status=%s body=%sNr   z3GHL move opportunity ok opp=%s payload=%s status=%sz)GHL move opportunity exception opp=%s: %sFr   )DEFAULT_PIPELINE_IDr   r   r    putr"   r#   r$   r%   r&   r'   r(   r)   r*   )r0   r1   r   r2   r3   r,   effective_pipeliner+   r   r-   r"   r.   s               r   move_opportunity_stager>   S   s$   $ 1( G(?,?!2%-!" 2"N/.)9
:CE"G LL7GRHTTKKQt
 HHE 1==!&&(($$  A>STUaQ s   BC D)$DDD)N)NN)__doc__loggingosr    	getLoggerr#   r   r   getenvstripr;   r   r*   dictr   tupleboolintr/   r>    r   r   <module>rJ      s    	 g015
  bii @"EKKM 9  c3h  #'	! ! !  !  4Z	! 
 4c>! P "7 7 Dj7  7  $J	7 
 t7  4c>7 r   