
    /i              !          d dl mZ d dlmZ d dlmZ d dlZd dl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mZmZmZ d d	lmZ  e       Z ej0                  e      Zej7                  d
eej8                         eej:                         eej<                        fdedefd       ZejA                  d
e       eej:                         e
ddd       e
dddd       e
ddd       e
ddd       e
dd       e
dd        e
dd!       e
dd"       e
dd#       e
dd$       e
dd%d&       e
dd'd(       e
dd)       e
dd*       eej<                        fded+e!d,e!d-e"d.e"d/ee"   d0ee"   d1ee"   d2ee"   d3ee"   d4ee   d5ee"   d6ee"   d7ee   d8ee   fd9       Z#ejA                  d:e$       eej:                         eej<                        fdefd;       Z%ejA                  d<e       eej:                         e
dd=       e
ddd>       eej<                        fd4eded+e!d,e!fd?       Z&ejA                  d@e       eej:                         eej<                        fdAedefdB       Z'ejQ                  d@e       eej:                         eej<                        fdAededefdC       Z)ejU                  d@e$       eej:                         eej<                        fdAedefdD       Z+y)E    )Optional)UUID)datetimeN)	APIRouterDependsHTTPExceptionQuerystatus)AsyncSession)deps)ViolationCreateViolationUpdateViolationResponseViolationListResponse)ViolationService/)response_modelstatus_codeviolation_indbc                 N   K   t        j                  ||        d{   }|S 7 w)a%  
    Create a new violation record. (Admin only)
    
    **Request Body:**
    - `product_name`: Name of the product
    - `msp`: Manufacturer Suggested Price
    - `scraped_price`: Price found during scraping
    - `url`: URL where the violation was found
    - `violation_date`: Date of the violation
    - `vendor_id`: (Optional) Associated vendor ID
    - `barcode_number`: (Optional) Product barcode
    - `reference_id`: (Optional) Reference identifier
    - `source_type`: (Optional) 'registered' or 'discovered' (default: 'registered')
    N)r   create_violation)r   r   current_user	violations       ?/var/www/html/marco-python-backend/app/api/routes/violations.pyr   r      s)     ( '77LIII J   %#%)r      zPage number)gedescription
   d   zItems per page)r   ler   violation_datez]^(violation_date|created_at|product_name|price_difference|percentage_difference|vendor_name)$zField to sort by)regexr   descz^(asc|desc)$z=Sort order: asc (A-Z/oldest first) or desc (Z-A/newest first)zSearch by product name)r   zDGlobal search across product name, vendor name, marketplace, and URLzSearch by vendor namezSearch by marketplacezSearch by URLzFilter by vendor IDz^(registered|discovered)$zFilter by source typez^(open|notified)$z-Filter by violation status (open or notified)zFilter from this datezFilter until this datepagelimitsort_by
sort_orderproduct_namesearchvendor_namemarketplaceurl	vendor_idsource_typeviolation_status	date_fromdate_toc                    K   t        j                  | |||||||||	|
||||       d{   \  }}t        ||||      S 7 w)a  
    Retrieve a list of all violations with pagination, sorting, and filtering.
    
    **Query Parameters:**
    - `page`: Page number (default: 1)
    - `limit`: Items per page (default: 10, max: 100)
    - `sort_by`: Sort field - violation_date, created_at, product_name, price_difference, percentage_difference, or vendor_name
    
    **Search Parameters (dynamic, partial match):**
    - `product_name`: Search by product name
    - `search`: Search by product name (alternative/legacy parameter)
    - `vendor_name`: Search by vendor name
    - `marketplace`: Search by marketplace (e.g., Amazon, eBay, Flipkart)
    - `url`: Search by URL
    
    **Filter Parameters:**
    - `vendor_id`: Filter by specific vendor ID
    - `source_type`: Filter by source (registered or discovered)
    - `violation_status`: Filter by status (open or notified)
    - `date_from`: Filter violations from this date (inclusive)
    - `date_to`: Filter violations until this date (inclusive)
    )r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   Nitemstotalr&   r'   )r   get_violationsr   )r   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r   
violationsr7   s                     r   r8   r8   -   si     r /==
!) J$ !zTQVWW%s   (AAAz/statisticsc                 L   K   t        j                  |        d{   }|S 7 w)z
    Get statistics about violations including:
    - Total violation count
    - Count by source type (registered vs discovered)
    - Average price difference
    - Average percentage difference
    N)r   get_statistics)r   r   statss      r   get_violation_statisticsr=   {   s%      #11"55EL 6s   $"$z/vendor/{vendor_id})r   )r   r"   c                 t   K   t        j                  || ||       d{   \  }}t        ||||      S 7 w)z?
    Get all violations associated with a specific vendor.
    )r/   r&   r'   Nr5   )r   get_violations_by_vendorr   )r/   r   r&   r'   r   r9   r7   s          r   get_vendor_violationsr@      sD      /GG
id% J !zTQVWW	s   868z/{violation_id}violation_idc                 N   K   t        j                  ||        d{   }|S 7 w)zH
    Retrieve a single violation by its ID with vendor information.
    N)r   get_violation_by_id)rA   r   r   r   s       r   get_violationrD      s)      '::2|LLI Mr   c                 P   K   t        j                  || |       d{   }|S 7 w)z4
    Update an existing violation. (Admin only)
    N)r   update_violation)rA   r   r   r   r   s        r   rF   rF      s+      '77L,WWI Xs   &$&c                 R   K   t        j                  ||        d{    ddiS 7 w)z1
    Delete a violation record. (Admin only)
    NmessagezViolation deleted successfully)r   delete_violation)rA   r   r   s      r   rI   rI      s/      
+
+B
===788 >s   '%	'),typingr   uuidr   r   loggingfastapir   r   r   r	   r
   sqlalchemy.ext.asyncior   app.apir   app.schemas.violationr   r   r   r   app.services.violation_servicer   router	getLogger__name__loggerpostHTTP_201_CREATEDget_dbget_current_userr   getintstrr8   dictr=   r@   rD   putrF   deleterI        r   <module>rb      s0       D D /   <				8	$ S!2@W@WX t{{+../! Y. C 56t{{+aA=9raC5EFm&
 S
 #(:R"S!$4z{!&t9P!Q!&t9P!QtA %d8M N!&)+"
 ',!C'
 %*$<S$T"':R"S../AJXJX
JX JX 	JX JX 3-JX SMJX  #!JX" ##JX$ 
#%JX& ~'JX( #)JX2 sm3JX< !=JX> h?JX 7JXZ M$/t{{+../ 0 !2GH t{{+aAraC(../XXX X 	X IX" .?@ t{{+../			 A	 .?@ t{{+../	

!
 	
 A
  6 t{{+../	9	9	9 7	9ra   