
    +ip              	       N   d dl 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
 d dlmZ d dlmZ d dlZdZ ee          Zed	         Z ed
dd          Ze                    edgddgdg           d Ze                    d          d             Ze                    d          de	e         fd            Ze                    d          defd            Ze                    d          d4de	e         de	e         fd            Ze                    d          defd             Ze                    d!           ed"d#$           ed"d%$           edd&$          fdeded'e	e         fd(            Ze                    d)           ed"d*$          fd+efd,            Ze                     d-           ed"d.          fd+efd/            Z!e                    d0          d4d+e	e         d'e	e         fd1            Z"e                    d2          d3             Z#dS )5    )FastAPIHTTPExceptionQueryBody)CORSMiddleware)datetime)OptionalList)MongoClient)ObjectIdNzCmongodb://admin:admin123@mongodb:27017/mcp_adcp_db?authSource=adminmcp_acdp_dbzACDP APIz1.0.0z8Advertising Context Data Protocol API built with FastAPI)titleversiondescription*T)allow_originsallow_credentialsallow_methodsallow_headersc                 6    t          | d                   | d<   | S )z/Convert MongoDB documents to JSON-safe objects._id)str)docs    /app/src/main.pyserialize_docr   (   s    SZCJJ    z/api/v1/channelsc                  r    t          t          d                                                   } d | D             S )List all channels.channelsc                 ,    g | ]}t          |          S  r   .0cs     r   
<listcomp>z get_channels.<locals>.<listcomp>5        ///M!///r   )listdbfind)r   s    r   get_channelsr+   1   s5     BzN''))**H//h////r   z/api/v1/adbreaks	availablec                 ^    t           d                             d| i          }d |D             S )r   	ad_breaksis_soldc                 ,    g | ]}t          |          S r!   r"   r#   s     r   r&   z get_adbreakd.<locals>.<listcomp>;   r'   r   )r)   r*   )r,   adbreakss     r   get_adbreakdr2   7   s4     +##Yy$9::H//h////r   z/api/v1/channels/{channel_id}
channel_idc                     t           j                            d| i          }|st          dd          t	          |          S )zGet single channel by ID.r3     zChannel not foundstatus_codedetail)r)   r   find_oner   r   )r3   channels     r   get_channelr;   =   sI     k""L*#=>>G I4GHHHH!!!r   z/api/v1/programsr:   datec                 Z   i }| r| |d<   |ri	 t          j        |          }t          j        |          }|                    ddd          }||d|d<   n# t          $ r t	          dd	          w xY wt          t          j                            |                    }d
 |D             S )z0Fetch EPG programs by channel and optional date.r3      ;   hourminutesecondz$gtez$lte
start_time  #Invalid date format. Use YYYY-MM-DDr6   c                 ,    g | ]}t          |          S r!   r"   r$   ps     r   r&   z get_programs.<locals>.<listcomp>Y   r'   r   )	r   fromisoformatreplace
ValueErrorr   r(   r)   programsr*   )r:   r<   querystartendrN   s         r   get_programsrR   I   s     E &%l _	_*400E(..C++2b+<<C+0#">">E, 	_ 	_ 	_C8]^^^^	_ BK$$U++,,H//h////s   AA A2z/api/v1/programs/{program_id}
program_idc                     t           j                            d| i          }|st          dd          t	          |          S )NrS   r5   zProgram not foundr6   )r)   rN   r9   r   r   )rS   programs     r   get_programrV   [   sG    k""L*#=>>G I4GHHHH!!!r   z/api/v1/inventory.zChannel ID (e.g., al_aoula))r   zDate in YYYY-MM-DDzRegion (e.g., France)regionc                    	 t          j        |          }|                    ddd          }n# t          $ r t	          dd          w xY wt          t          j                            | ||dd                    }d	 |D             }|sg S t          t          j	                            d
d|ii                    }g }|D ]}	t          |	          }
t          j                            d|	d         i          }|rt          |          |
d<   |rCt          j                            |	d         d| dddd          }|rt          |          |
d<   |                    |
           |S )z8Return ad inventory by channel/date and optional region.r>   r?   r@   rF   rG   r6   rD   )r3   rE   c                     g | ]
}|d          S )rS   r!   rI   s     r   r&   z!get_inventory.<locals>.<listcomp>x   s    555q1\?555r   rS   z$ininventory_idad_break_idprice^$iz$regexz$options)rZ   rW   audience)r   rK   rL   rM   r   r(   r)   rN   r*   r.   r   inventory_pricesr9   audience_dataappend)r:   r<   rW   rP   rQ   rN   program_idsr.   resultsadad_datar\   ra   s                r   get_inventoryri   f   s   [&t,,mmBrm:: [ [ [4YZZZZ[ BK$$$c22& &    H 65H555K 	R\&&uk6J'KLLMMIG    ###,,nb>O-PQQ 	4,U33GG 	>'00 "= 1%2]]]DD2 2  H  >&3H&=&=
#wNs	   ,/ Az/api/v1/pricingzInventory/Ad Break IDrZ   c                     t           j                            d| i          }|st          dd          t	          |          S )z2Get pricing info for a given ad break (inventory).rZ   r5   z'Pricing not found for this inventory IDr6   )r)   rb   r9   r   r   )rZ   r\   s     r   get_pricingrk      sJ     ((.,)GHHE _4]^^^^r   z/api/v1/book_ad)embedc                    t           j                            d| i          }|st          dd          |                    dd          rt          dd          t           j                            d| id	dd
ii           d| dS )zMark an ad break as sold.r[   r5   zAd break not foundr6   r/   FrF   zThis ad is already soldz$setTzAd booked successfully)messagerZ   )r)   r.   r9   r   get
update_one)rZ   ad_breaks     r   book_adrr      s     |$$m\%BCCH J4HIIII||Iu%% O4MNNNNL]L9FYPTDU;VWWW/NNNr   z/api/v1/audiencec                     i }| r| |d<   |rd| ddd|d<   t          t          j                            |                    }d |D             S )z+Fetch audience data by inventory or region.rZ   r]   r^   r_   r`   rW   c                 ,    g | ]}t          |          S r!   r"   )r$   ds     r   r&   z get_audience.<locals>.<listcomp>   s     +++M!+++r   )r(   r)   rc   r*   )rZ   rW   rO   datas       r   get_audiencerw      so     E - ,n E%2]]]DDh %%e,,--D++d++++r   /c                      ddddS )NokzACDP v1u5   Advertising Context Data Protocol API is running 🚀)statusapirn   r!   r!   r   r   rootr}      s     J  r   )NN)$fastapir   r   r   r   fastapi.middleware.corsr   r   typingr	   r
   pymongor   bsonr   os	MONGO_URIclientr)   appadd_middlewarer   ro   r+   boolr2   r   r;   rR   rV   ri   rk   postrr   rw   r}   r!   r   r   <module>r      s   8 7 7 7 7 7 7 7 7 7 7 7 2 2 2 2 2 2       ! ! ! ! ! ! ! !             				
 R		Y		M
 g
J     %%%       	0 0 0
 	08D> 0 0 0 0
 	())"C " " " *)" 	0 0(3- 0hsm 0 0 0 0" 	())"C " " " *)" 	5*GHHHc';<<<!E$4KLLL' ''
' SM' ' ' 'T 	$)E#;R$S$S$S    c         
 $S 5 5 5 
O 
O# 
O 
O 
O 
O  		, 	,x} 	,Xc] 	, 	, 	, 	,     r   