
    /i.                        d dl mZmZ d dlmZ d dlmZmZmZ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mZ d d	lmZmZmZmZmZmZmZmZm Z m!Z!m"Z" d d
l#m$Z$  e       Z%e%jM                  de       e
dd       e
ddd       e
dd      d ee       ee      fde'de'dee(   dee(   dedefd       Z)e%jU                  dee	jV                         ee       ee      fdededefd       Z,e%jM                  de       ee       ee      fd ededefd!       Z-e%j]                  de       ee       ee      fd edededefd"       Z/e%ja                  de	jb                  #       ee       ee      fd edefd$       Z2e%jU                  d%       ee       ee      fdededefd&       Z3e%jM                  d'e       ee       ee      fd ededefd(       Z4e%jU                  d)       ee       ee      fde dede5fd*       Z6e%jU                  d+       ee       ee      fde dede5fd,       Z7e%jU                  d-       ee       ee      fde!dede5fd.       Z8e%jU                  d/       ee       ee      fdededefd0       Z9e%jU                  d1       ee       ee      fdededefd2       Z:y)3    )ListOptional)UUID)	APIRouterDependsHTTPExceptionstatusQueryResponse)StreamingResponse)AsyncSession)get_current_user)get_db)DEFAULT_NOTIFICATION_SUBJECTDEFAULT_NOTIFICATION_MESSAGE)VendorCreate	VendorOutVendorUpdateVendorListResponseVendorDetailsOutExportRequestExportScrapingResultsRequestExportCombinedReportRequestNotificationRequestSendCustomNotificationRequestViolationOut)vendor_servicez/vendors)response_model   )ge   d   )r    leNz)^(name|violation_count|average_discount)$)regexpage	page_sizesort_bysearchdbreturnc                   K   t        j                  || |||       d {   \  }}g }|D ]  }	t        j                  ||	       d {   \  }
}|j                  t	        |	j
                  |	j                  |	j                  |	j                  |	j                  |	j                  |
t        |d                    t        ||| |      S 7 7 w)N)r%   r&   r'   r(      idname
brand_nameemailwebsite_url	is_activeviolation_countaverage_discount)itemstotalr%   r&   )r   list_vendorscompute_metricsappendr   r.   r/   r0   r1   r2   r3   roundr   )r%   r&   r'   r(   r)   current_uservendorsr7   r6   vcountavgs               </var/www/html/marco-python-backend/app/api/routes/vendors.pyr8   r8       s      *66
GF NGU  E 
)99"a@@
s44VV<<ggMM++ %!&sA		

 ETYWW%
 As"   CC	'CC	BCC)r   status_codepayloadc                    K   t        j                  || j                  | j                  | j                  | j
                  | j                         d {   }t        j                  |      S 7 w)N)r/   r0   r1   r2   r3   )	r   create_vendorr/   r0   r1   r2   r3   r   model_validate)rC   r)   r<   vendors       rA   rE   rE   >   sa      "//
\\%%mm''## F ##F++s   AA/A-A/z/vendors/{vendor_id}	vendor_idc                 D  K   t        j                  ||        d {   }t        j                  ||       d {   \  }}t        |j                  |j
                  |j                  |j                  |j                  |j                  |t        |d            S 7 ~7 bw)NrH   r,   r-   )r   
get_vendorr9   r   r.   r/   r0   r1   r2   r3   r;   )rH   r)   r<   rG   r?   r@   s         rA   rK   rK   O   s     !,,R9EEF%55b&AAJE399[[$$ll&&""sA	 	 FAs    B BB BA!B B c                   K   |j                  d      }t        j                  || |t        |j                               d {   }t        j
                  ||       d {   \  }}t        |j                  |j                  |j                  |j                  |j                  |j                  |t        |d            S 7 ~7 bw)NT)exclude_none)rH   data
changed_byr,   r-   )
model_dumpr   update_vendorstrr1   r9   r   r.   r/   r0   r2   r3   r;   )rH   rC   r)   r<   rN   rG   r?   r@   s           rA   edit_vendorrS   _   s      40D!//
ids<;M;M7N F &55b&AAJE399[[$$ll&&""sA	 		 Bs%   ACCC"C#A!CCrB   c                    K   t        j                  ||        d {    t        t        j                        S 7 w)NrJ   rT   )r   delete_vendorr   r	   HTTP_204_NO_CONTENT)rH   r)   r<   s      rA   rV   rV   w   s3     

&
&rY
??? : :;; @s   ><>z/vendors/exportc                    K   t        j                  || j                         d {   }t        t	        |g      dddi      S 7 w)N)
vendor_idsAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetContent-Dispositionz$attachment; filename=violations.xlsx
media_typeheaders)r   export_violationsrY   r   iterrC   r)   r<   contents       rA   r_   r_   }   sR      #44
%% G gYV&(NO 	s   %AAAz/vendors/{vendor_id}/detailsc                   K   t        j                  ||        d {   \  }}t        j                  ||       d {   \  }}t        |j                  |j
                  |j                  |j                  |j                  |j                  |t        |d      |D cg c]  }t        j                  |       c}	      S 7 7 c c}w w)NrJ   r,   )	r.   r/   r0   r1   r2   r3   r4   r5   
violations)r   get_vendor_with_violationsr9   r   r.   r/   r0   r1   r2   r3   r;   r   rF   )rH   r)   r<   rG   rd   r?   r@   r>   s           rA   vendor_detailsrf      s       .HHW`aaFJ%55b&AAJE399[[$$ll&&""sA<FGqL//2G
 
 bA Hs2   C
C C
CAC
C9	C
C
C
z/vendors/notifyc                 h   K   t        j                  || j                         d {    ddiS 7 w)Nviolation_idsmessagezNotifications sent)r   send_violation_notificationsri   )rC   r)   r<   s      rA   send_notificationsrl      s6      
5
5bH]H]
^^^+,, _s   %20	2z/vendors/notify-custom/prefillc                 d   K   t        j                  || j                         d{   }|S 7 w)a  
    Get pre-fill data for the notification modal.
    
    Returns:
    - recipient_email: Auto-fetched from vendor (if single vendor)
    - subject: Default subject template
    - message_body: Default message template
    - violation_details: Details of violations
    rh   N)r   get_violations_prefill_datari   )rC   r)   r<   violations_datas       rA   get_notification_prefillrp      s0      +FFrY`YnYnooO ps   %0.0z/vendors/notify-customc                   K   ddl }|j                  t              }|j                  d       |j                  d| j                          |j                  d| j
                          |j                  dt        | j                                |j                  dt        | j                                | j                  rj|j                  dt        | j                         d	       |j                  d
| j                  dd         |j                  dd| j                  v         n|j                  d       | j                  r| j                  nt        }| j                  r| j                  nt        }| j
                  }|j                  d       |j                  d|dd         |j                  d| j                  rdnd        |j                  dt        |       d	       |j                  d|        t        j                  || j                  | j
                  ||       d{    dd| j
                   iS 7 w)u  
    Send custom violation notification email to ANY email address provided.
    
    REQUIRED fields:
    - violation_ids: List of violation IDs to include
    - recipient_email: Email address where the notification should be sent
    
    OPTIONAL fields (will use defaults if not provided):
    - subject: Email subject (defaults to "Price Violation Notice – Immediate Attention Required")
    - message_body: Email body in HTML format (defaults to standard template with all variables)
    
    Template variables supported in message_body:
    - {{VIOLATIONS}}: Placeholder for product violation details (repeats for each selected violation)
    - {{VENDOR_NAME}}: Vendor name (substituted once in header/footer)
    - {{PRODUCT_NAME}}: Product name (used within {{VIOLATIONS}} section for each violation)
    - {{MSP}}: Minimum Selling Price with ₹ currency (used within {{VIOLATIONS}} section)
    - {{SCRAPED_PRICE}}: Detected selling price with ₹ currency (used within {{VIOLATIONS}} section)
    - {{PRODUCT_URL}}: Link to product listing (used within {{VIOLATIONS}} section)
    - {{VIOLATION_DATE}}: Date violation was detected (used within {{VIOLATIONS}} section)
    - {{COMPANY_NAME}}: Your company name
    - {{SUPPORT_EMAIL}}: Support email address
    
    USAGE PATTERN:
    Include {{VIOLATIONS}} placeholder in your message where product details should appear.
    The system will replace {{VIOLATIONS}} with product details for each selected violation.
    Example: "Dear {{VENDOR_NAME}},

...intro text...

{{VIOLATIONS}}

...closing text..."
    
    When 2 violations selected, {{VIOLATIONS}} becomes:
    - Product 1 details (all variables substituted)
    - Product 2 details (all variables substituted)
    r   Nz"[/notify-custom] Request received:z  - violation_ids: z  - recipient_email: z  - subject provided: z  - message_body provided: z  - message_body LENGTH: z charsz,  - message_body PREVIEW (first 300 chars): i,  z  - message_body IS HTML: <z:  - message_body is EMPTY/NULL - will use DEFAULT templatez'[/notify-custom] FINAL content to send:z  - Subject: r"   z  - Message_body source: zCUSTOM (from user)zDEFAULT templatez  - Message_body length: z  - Will send email to: )ri   recipient_emailsubjectmessage_bodyrj   zCustom notification sent to )logging	getLogger__name__infori   rs   boolrt   ru   lenr   r   r   "send_custom_violation_notification)rC   r)   r<   rv   loggerrt   ru   rs   s           rA   send_custom_notificationr~      s    J x(F KK46
KK%g&;&;%<=>
KK'(?(?'@AB
KK(goo)>(?@A
KK-d73G3G.H-IJK/G4H4H0I/J&QRB7CWCWX\Y\C]B^_`08L8L1L0MNOPR ")goo6RG+2+?+?7''EaL--O
KK9;
KK-/0
KK+GDXDX,@^p+qrs
KK+C,=+>fEF
KK*?*;<=

;
;
++//!   5g6M6M5NOPPs   H1I3I	4Iz /vendors/export-scraping-resultsc                    K   t        j                  || j                  | j                  | j                         d{   }t        t        |g      dddi      S 7 w)z
    Export scraping results to XLSX.
    
    Optional filters:
    - vendor_id: Filter by vendor
    - product_id: Filter by product
    - status_filter: Filter by compliance status ('compliant', 'violation', 'complaining', 'unknown')
    )rH   
product_idstatus_filterNrZ   r[   z*attachment; filename=scraping_results.xlsxr\   )r   export_scraping_resultsrH   r   r   r   r`   ra   s       rA   r   r   
  sd      #::
##%%++	 G gYV&(TU s   ;AAAz/vendors/export-combined-reportc                    K   t        j                  || j                  | j                         d{   }t	        t        |g      dddi      S 7 w)z
    Export combined report with both violations and scraping results.
    
    Optional filters:
    - vendor_id: Filter by vendor
    - product_id: Filter by product
    )rH   r   NrZ   r[   z)attachment; filename=combined_report.xlsxr\   )r   export_combined_reportrH   r   r   r`   ra   s       rA   r   r   %  s[      #99
##%% G
 gYV&(ST s   0AAA);typingr   r   uuidr   fastapir   r   r   r	   r
   r   fastapi.responsesr   sqlalchemy.ext.asyncior   app.api.depsr   app.db.sessionr   app.services.vendor_servicer   r   app.schemas.vendorr   r   r   r   r   r   r   r   r   r   r   app.servicesr   routergetintrR   r8   postHTTP_201_CREATEDrE   rK   putrS   deleterW   rV   r_   rf   dictrl   rp   r~   r   r        rA   <module>r      s3   !  N N / / ) !    (	 J'9:aA2!,"4/Z[ v)*X
XX c]X SM	X
 	X X ;X: Z	v?V?VW v)*,,, 	, X,  "9=9@W^_oWp  , u~  > "9= v)*	 	
  >. %63M3MN<CFOZabrZs <4 <\ < O<
  v)* 	    *;KL v)* 	 M(  v)*- -- 
	-  - -. v)*  
	 /" %& v)*HQ*HQHQ 
	HQ 'HQT /0 v)*) 	 14 ./ v)*( 	 0r   