o
    IiJ                     @   s   d dl Z d dlmZ d dlZdd Zdd Zdd Zdd
dZdddZdd Z	dd Z
dd ZedkrBdZdZe
edg d dS dS )    N)defaultdictc           	      C   s   | dkrdS | d}| d\}}t|dkrL|ddd }|dd g}|dd }tdt|dD ]}||||d   q3d	|ddd }n|}d
| d| S )uD   
    Format amount in Indian currency format ₹xx,xx,xx,xxx.zz
    r   u   ₹0.00z.2f.   N   ,u   ₹)splitlenrangeappendjoin)	amount
amount_strinteger_partdecimal_partreversed_intformatted_parts	remainingiformatted_int r   :/var/www/html/minaions-tender/ai-engine/seller_analysis.pyformat_indian_currency   s   r   c              	   C   s>   | sdS t ddt| }zt|W S  ttfy   Y dS w )z3
    Parse price string and return float value
            z[^\d.] )resubstrfloat
ValueError	TypeError)	price_strcleaned_pricer   r   r   parse_price&   s   
r#   c                 C   s   zed| v rcd| d v rc| d d }d|v rc|d }t |tr+d|v r+|d di }nt |tr7|di }ni }|rcd|v rc|d }t |trc| }t|D ]}|rb|dsb|    W S qPW dS  t	yo   Y dS w )	z3
    Extract location from bid's buyer details
    detailedInfosections
bidDetailsparentbuyerDetailsaddress*N)

isinstancedictgetr   r   reversed
startswithstriptitle	Exception)bidr%   bid_detailsbuyer_detailsr)   partspartr   r   r   extract_location_from_bid5   s,   

r8   anyc                 C   s   | r|sdg fS t |tr|  g}ndd |D }|s"dg fS d|  }g }|D ]}||v r8|| q-| dkrKt|t|k}||fS t|dk}||fS )a  
    Check if keywords match in bd_category_name and return which keywords matched

    Args:
        bd_category_list (list): List of category strings from bd_category_name
        keywords (str or list): Single keyword string or list of keywords
        search_mode (str): "any" (OR logic) or "all" (AND logic)

    Returns:
        tuple: (bool: match_found, list: matched_keywords)
    Fc                 S   s    g | ]}|  r|   qS r   )r0   lower).0kwr   r   r   
<listcomp>k   s     z4check_keyword_match_with_details.<locals>.<listcomp> allr   )r+   r   r0   r:   r   r   r	   )bd_category_listkeywordssearch_modekeyword_listcategory_textmatched_keywordskeywordmatch_foundr   r   r    check_keyword_match_with_detailsX   s$   

rH   c           &      C   sN  t | ddd}t|}W d   n1 sw   Y  tdd }d}d}g }	|d D ]}
|d	7 }g }|rt|
d
dg|
ddg |
di di dg  |
di di dg  }t|||\}}|st|	|
d q,|d	7 }t|
}d|
vsd|
d vrq,|
d d }d|vsd|d vrq,|d d }d}d|d v rd|d d v r|d d d r|d d d }|D ]?}|dd }|sq|| d dkr||| d< |r|| d 	| |D ]}|| d 	| q|| d  d	7  < |dd 
 }|r|| d  d	7  < |dkr|| d   d	7  < |d!d"}t|}|| d#  |7  < |r|| d$ si }d%|v r^|d% r^|d%  r^|d%  |d%< d&|v rw|d& rw|d&  rw|d&  |d&< |r||| d$< n|d'kr|| d(  d	7  < n
|| d)  d	7  < g }|d*d}|r|d+vr|| |d,d}d-|v r|d- d.|v r|d. |d/d}|rd-|v r|d- d.|v r|d. d0|v r|d0 |D ]}|| d1 	| qqq,|D ]-}tt|| d1 || d1< tt|| d || d< tt|| d || d< qg }| D ]E\}}|d |d |d |d) |d  |d( t|d# |d# |d |d |d1 rhd2|d1 nd3d4} |d$ rw|d$ | d$< ||  q8|jd5d d6d7 i }!|rt|tr|g|!d8< nt||!d8< ||!d9< ||!d:< ||!d;< nd}!t||d d< |d d= ttd>d? |D |!|	d@g dA}"t|d	D ]>\}#}|#|d |d |d |d) |d  |d( |dB |dC |dD |d1 dE} d$|v r|d$ r|d$ | d$< |"d |  qt |dFdd}tj|"|dGdHdI W d   n	1 s,w   Y  tdJt| dK |r\d2|!d8 }$tdL|$ dM| dN tdO| dP| dQ ntdR tdS|  tdT|"d dU   tdV t|ddW d	D ]\}#}t|# dX|d  dY|d  dZ td[|d  d\|d)   td]|d   d^|d(   td_|dB   td`|dC rd2|dC nda  tdb|dD rd2|dD nda  d$|v r	|d$ r	|d$ }d%|v rtdc|d%   d&|v r	tdd|d&   qdedf |D }%|%r!tdgt|% dh dS tdi dS )ja  
    Analyze bid data to extract seller statistics and save to output JSON file.

    Args:
        input_file_path (str): Path to input JSON file
        output_file_path (str): Path to output JSON file
        search_keywords (str or list, optional): Keywords to filter bids by bd_category_name
        search_mode (str): "any" for OR logic, "all" for AND logic (default: "any")
    rzutf-8)encodingNc                   S   s"   dddddddt  t  i t  dS )Nr   r   r   )seller_nametotal_bids_appliedtotal_bids_qualifiedtotal_bids_disqualifiedtotal_bids_won_l1total_bids_l2total_amount_won_l1	locationsrE   seller_detailsspecial_status)setr   r   r   r   <lambda>   s   z!analyze_bidders.<locals>.<lambda>r   bids   r1   r   descriptionmetadataapiDatabd_category_name	bbt_title	bidNumberr$   r%   
evaluationsellerssummaryl1Winner_details
sellerNamerK   rR   rE   rL   rankrM   L1rO   
totalPrice0rQ   rS   r)   contactL2rP   rN   	mseStatus)N/Ar   statusMSEMII
statusTypez	Under PMArT   z, None)rK   rL   rM   rN   rO   rP   total_amount_won_l1_formattedtotal_amount_won_l1_rawseller_locationskeyword_matchesrT   c                 S   s   | d S )NrL   r   )xr   r   r   rV   F  s    T)keyreverserA   rB   total_bids_in_sourcefiltered_bids_count	scrapedAt	totalBidsc                 s   s    | ]}|d  V  qdS )rr   Nr   r;   sellerr   r   r   	<genexpr>[  s    z"analyze_bidders.<locals>.<genexpr>)total_unique_sellersanalysis_datesource_total_bidstotal_amount_won_all_l1_bidsfilter_appliedbids_not_matched)rZ   r`   rq   rs   rt   )serial_numberrK   rL   rM   rN   rO   rP   rQ   rs   rt   rT   wr   F)indentensure_asciizAnalysis complete! Found z unique sellers.zFilter applied: Keywords 'z' with 'z' logicz
Processed z out of z total bidsz-No keyword filter applied - analyzed all bidszResults saved to: z%
Total amount won by all L1 bidders: r   z$
Top 5 sellers by bid participation:   z. z: z bidsz   - Qualified: z, Disqualified: z   - L1 wins: z, L2: z   - Amount won: z   - Locations: rk   z   - Keywords: z   - Address: z   - Contact: c                 S   s@   g | ]}|d  |d  |d ks|d |d  |d  kr|qS )rM   rN   rL   rO   rP   r   r|   r   r   r   r=     s
    z#analyze_bidders.<locals>.<listcomp>z
Warning: Found z% sellers with data validation issues.u.   
✓ All seller data passed validation checks.)openjsonloadr   r-   rH   r   r8   r0   addupperr#   sortedlistitemsr   r   sortr+   r   r	   sum	enumeratedumpprint)&input_file_pathoutput_file_pathsearch_keywordsrB   filedataseller_statstotal_bids_processedry   r   r3   rE   r@   rG   bid_locationr%   r`   l1_winner_detailsr}   rK   rF   rd   total_pricer   detailsspecial_statuses
mse_statusmain_statusstatus_typerl   sellers_liststatsseller_entryfilter_infooutput_datar   keywords_strvalidation_issuesr   r   r   analyze_bidders   sj  T


















] 




"&&

r   c                 C      t | ||dS )zSearch for a single keywordr9   r   )
input_fileoutput_filerF   r   r   r   analyze_single_keyword     r   c                 C   r   )z)Search for any of the keywords (OR logic)r9   r   r   r   keywords_listr   r   r   analyze_any_keywords  r   r   c                 C   r   )z#Search for all keywords (AND logic)r?   r   r   r   r   r   analyze_all_keywords  r   r   __main__z%/content/processed_bids_data (1).jsonzseller_analysis_output.jsonzexxon_resellers.json)	lubricantgreaseMobilzgear oilzhydraulic oilz
engine oil)r9   )Nr9   )r   collectionsr   r   r   r#   r8   rH   r   r   r   r   __name__r   r   r   r   r   r   <module>   s$    !
#
+  $