o
    g,                     @   s  d Z ddlmZ ddlmZmZmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZ ddlmZ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 ddlmZ ddlmZ ddl m!Z! e Z"e"#dZ$eddgdddiig dZ%G dd de&eZ'e! Z(e%j)dee de'j*dfde&de'de+dee fdd Z,e%j-d!ee&ef dd"e&d#e&de'd$e+fd%d&Z.e%)d'd$e+d"e&dee fd(d)Z/e%j)d*eee&ef  ded+d,deee&ef  fd-d.Z0e%j1d/ee&ef dd0e+dee&ef fd1d2Z2G d3d4 d4eZ3e%-d5d6e3fd7d8Z4G d9d: d:eZ5e%-d;d6e5fd<d=Z6e%-d>d?efd@dAZ7e%)dBdCe&fdDdEZ8dFS )GzBuyers and Targets router    )Enum)AnyDictList)	APIRouterHTTPException)	BaseModel)BuyersTargetsBuyersTargetsInfoModelBuyersPeopleInfoCreate)CompanyInfoModelSqlFundInfoModelSql)BuyersTargetsInfoBuyersTargetsRecordTypeBuyersPeopleInfo)DynamoDB)ServiceLogger)mysql_db)redis_cache)Optional)ApolloClientINFOz/buyers_targetsbuyers_targets  descriptionz	Not found)prefixtags	responsesdependenciesc                   @   s   e Zd ZdZdZdZdZdS )
SearchTypez"Search type for buyers and targetscompanyinvestorbothN)__name__
__module____qualname____doc__COMPANYINVESTORBOTH r*   r*   6/var/www/html/XCapMarket/controllers/buyers_targets.pyr   -   s
    r   z/search)response_model
   search_termsearch_typelimitreturnc              
      s   g  fdd}z%|t jt jhv r|tt jI dH  |t jt jhv r.|tt jI dH  W S  tyG } ztddt|id|d}~ww )z`
    Search for company_name, root_url, or ticker in the company_info and fund_info tables.
    c                    sD   |  \}}tj| ||dI d H } fdd|D  d S )N)modelfiltersorder_byr0   c                 3   s$    | ]}i |  d  iV  qdS )target_typeNto_dict.0resultr/   r*   r+   	<genexpr>J   s
    
z>search_company_info.<locals>.perform_search.<locals>.<genexpr>)search_filtersr   execute_queryextend)r2   r/   r3   r4   search_resultsr0   resultsr.   r;   r+   perform_searchB   s   z+search_company_info.<locals>.perform_searchN  messagestatus_codedetail)	r   r'   r)   r   r(   r   	Exceptionr   str)r.   r/   r0   rC   er*   rA   r+   search_company_info7   s   	rL   z/add
project_idroot_urlrecord_type_idc           
   
      s  zjt  }|tjkr|j}n|tjkr|j}ntddd|||}|du r-tddd|d|d|d| |d	rH|d	i d
nd||dd}t	j
tfi |I dH }|du rgtddd| W S  ty }	 z	tdt|	d|	d}	~	ww )zI
    Retrieve company information based on root_url and search_type.
    rD   zInvalid search typerF   Nr   zItem not foundrN   company_namelogologo_urlsector)
company_idcompany_urlrP   rM   rR   rO   category_namezFailed to save buyers targets  )r   r   r'   company_info_tabler(   fund_info_tabler   get_itemgetr   insert_new_recordr   r7   rI   rJ   )
rM   rN   r/   rO   dbtableresponserecord_data
new_recordrK   r*   r*   r+   save_buyers_targets\   s:   


rb   z/get_by_record_typec              
      s   zMt j| kt j|kg}tjt |dI dH }g }|D ]1}| }|d}d}|r@tjttjt	|kgdI dH }	|	r@|	d j
}t	||d< || q|W S  tyc }
 z	tdt	|
d|
d}
~
ww )zh
    Retrieve buyers_targets based on record_type_id, loop through results, and fetch people_count.
    r2   r3   NrT   r   people_countrW   rF   )r   rO   rM   r   r>   r7   r[   r   
company_IDrJ   rd   appendrI   r   )rO   rM   r3   rB   r_   r:   target_dictrT   rd   people_info_resultsrK   r*   r*   r+   !get_buyers_targets_by_record_type   s8   

ri   z/record_typesi,  )ttlc               
      sP   zt jtdI dH } dd | D W S  ty' } z	tdt|d|d}~ww )zK
    Retrieve all record types from the BuyersTargetsRecordType model.
    )r2   Nc                 S      g | ]}|  qS r*   r6   r8   r*   r*   r+   
<listcomp>       z$get_record_types.<locals>.<listcomp>rW   rF   )r   r>   r   rI   r   rJ   )rB   rK   r*   r*   r+   get_record_types   s   rn   z/delete/{record_id}	record_idc              
      s^   zt jt| dI dH }|stdddd| dW S  ty. } z	tdt|d|d}~ww )	z<
    Delete a buyers_targets record based on record_id.
    )r2   ro   Nr   zRecord not foundrF   zRecord deleted successfully)rE   ro   rW   )r   delete_recordr   r   rI   rJ   )ro   deleted_recordrK   r*   r*   r+   delete_buyers_target   s   rr   c                   @   s2   e Zd ZU eed< eed< ee ed< eed< dS )SearchRequestCompanyq_organization_namepageq_organization_websiteper_pageN)r#   r$   r%   rJ   __annotations__intr   r*   r*   r*   r+   rs      s
   
 rs   z/search_companies/requestc              
      N   zt j| j| j| jd}|W S  ty& } ztddt| dd }~ww )N)queryru   rw   rW   zError fetching companies: rF   )apollo_clientsearch_organizationsrt   ru   rw   rI   r   rJ   rz   r_   rK   r*   r*   r+   search_companies   s   r   c                   @   s&   e Zd ZU eed< eed< eed< dS )SearchRequestPeopleq_organization_idru   rw   N)r#   r$   r%   rJ   rx   ry   r*   r*   r*   r+   r      s   
 r   z/search_people/c              
      r{   )N)organization_idru   rw   rW   zError fetching people: rF   )r}   search_peopler   ru   rw   rI   r   rJ   r   r*   r*   r+   r     s   r   z/buyers_people_info/buyer_people_infoc              
      s   z_t ttj| jkI d H }|r;| j|_| j|_| j|_| j|_| j|_t 	|I d H }|r4ddiW S t
dddW S t| j| j| j| j| j| jd}t 	|I d H }|rZddiW S t
dddW S  tyw } zt
dd	t| dd }~ww )
NrE   zRecord updated successfullyrW   zError updating recordrF   )buyers_targets_info_IDApolloCompany_IDselected_people_idsre   company_datard   zRecord created successfullyzError inserting recordError: )r   	fetch_oner   re   r   r   r   r   rd   execute_insertr   rI   rJ   )r   existing_recordupdated_recordra   inserted_recordrK   r*   r*   r+   #create_or_update_buyers_people_info  sJ   



r   z/buyers_people_info_details/rT   c              
      sh   zt jttj| kgdI dH }|sg W S dd |D W S  ty3 } ztddt| dd}~ww )zA
    Retrieve buyers' people info based on the company name.
    rc   Nc                 S   rk   r*   r6   r8   r*   r*   r+   rl   R  rm   z*get_buyers_people_info.<locals>.<listcomp>rW   r   rF   )r   r>   r   re   rI   r   rJ   )rT   rh   rK   r*   r*   r+   get_buyers_people_infoC  s   r   N)9r&   enumr   typingr   r   r   fastapir   r   pydanticr   models.buyers_targetsr	   r
   r   2services.company_profile.data_classes.company_infor   r    services.sql.buyers_targets_infor   r   r   utils.dynamo_dbr   utils.loggerr   utils.mysql_dbr   utils.redis_cacher   r   'services.outreach.apollo_contact_finderr   service_logger
get_loggerloggerr   rJ   r   r}   r[   r)   ry   rL   postrb   ri   rn   deleterr   rs   r   r   r   r   r   r*   r*   r*   r+   <module>   s    

$.71