
    2fh                        d dl mZ d dlmZ d dlmZmZ ddlmZm	Z	  G d dej                        Z e eddd	d
ddddddgd d d d      g       G d dej                               Z G d dej                        Zy)    )serializers)timezone)extend_schema_serializerOpenApiExample   )	StructureChannelSettingsc                       e Zd ZdZ ej
                  d      Z ej                  dd      Z ej                  e
j                  d      Z ej
                  d	d
      Z ej                  ddd      Zd Zy)!IndividualAccommodationSerializerz8Serializer for individual accommodation booking settingszProperty ID)	help_textTzProperty name)	read_onlyr   z"Booking type: relative or absolute)choicesr   r   z>Booking value (days for relative, specific value for absolute))	min_valuer   Fz/Booking until date (required for absolute type))required
allow_nullr   c                 f    |d   dk(  r(|j                  d      st        j                  ddi      |S )z>Validate that booking_until_date is provided for absolute typebooking_typeabsolutebooking_until_datez9Booking until date is required for absolute booking type.getr   ValidationError)selfattrss     */backend/structures/channel_serializers.pyvalidatez*IndividualAccommodationSerializer.validate   s>     J.uyyAU7V--%'bc      N)__name__
__module____qualname____doc__r   IntegerFieldproperty_id	CharFieldproperty_nameChoiceFieldr	   BOOKING_TYPE_CHOICESr   booking_value	DateFieldr   r    r   r   r   r      s    B*+**]CK)K))DOTM*;**446L -K,,RM /..Cr   r   zChannel Settings Requestrelative   Nr      z
2025-09-02)r#   r   r(   r   )	structuredefault_booking_typedefault_booking_valuedefault_booking_until_dateindividual_accommodationsbooking_percentageairbnb_percentageexpedia_percentage)value)examplesc                        e Zd ZdZ ej
                   e       ddd      Z G d d      Zd Z	d	 Z
d
 Zd Zd Z fdZ xZS )ChannelSettingsSerializerzISerializer for channel settings including availability and price settingsFTz$Individual property booking settings)childr   allow_emptyr   c                        e Zd ZeZg dZg dZy)ChannelSettingsSerializer.Meta)idr.   r/   r0   r1   r2   r3   r4   r5   
created_at
updated_at)r>   r?   r@   N)r   r   r    r	   modelfieldsread_only_fieldsr*   r   r   Metar=   B   s    	
 >r   rD   c                 :    |dk  rt        j                  d      |S )zValidate default booking valuer   z)Default booking value must be at least 1.)r   r   )r   r6   s     r   validate_default_booking_valuez8ChannelSettingsSerializer.validate_default_booking_valueP   s     19--.YZZr   c                     |j                  d      dk(  r(|j                  d      st        j                  ddi      dD ].  }||v s||   dk  s	||   dkD  st        j                  |di       |S )	zCross-field validationr/   r   r1   zADefault booking until date is required for absolute booking type.)r3   r4   r5   r   d   z%Percentage must be between 0 and 100.r   )r   r   fields      r   r   z"ChannelSettingsSerializer.validateV   s     II,-;		67--,.q/  
 WE~5<!#3uU|c7I!11B3   W r   c                     |j                  dg       }t        j                  j                  dd| j                  d   j
                  i|}| j                  ||       |S )z6Create channel settings with individual accommodationsr2   
created_byrequestr*   )popr	   objectscreatecontextuser"_process_individual_accommodations)r   validated_dataindividual_accommodations_datachannel_settingss       r   rO   z ChannelSettingsSerializer.createh   si    )7););<WY[)\& +2299 
||I.33

 	//0@B`ar   c                     |j                  dd      }| j                  d   j                  |_        |j	                         D ]  \  }}t        |||        |j                          || j                  ||       |S )z6Update channel settings with individual accommodationsr2   NrL   )rM   rP   rQ   
updated_byitemssetattrsaverR   )r   instancerS   rT   rI   r6   s         r   updatez ChannelSettingsSerializer.updatew   sz    )7););<WY])^& #ll95::*002LE5HeU+ 3 *533H>\]r   c                     i }|D ]C  }t        |d         }|d   |d   |j                  d      r|d   j                         ndd||<   E ||_        |j	                          y)z&Process individual accommodations datar#   r   r(   r   N)r   r(   r   )strr   	isoformatr2   rZ   )r   rU   accommodations_dataaccommodations_dictaccommodation_datar#   s         r   rR   z<ChannelSettingsSerializer._process_individual_accommodations   s     "50?@K 2> B!3O!D *--.BC '';<FFHIM0, #6 6I2r   c                    t         	|   |      }g }|j                  rddlm} |j                  j                         D ]l  \  }}	 |j                  j                  t        |            }t        |      |j                  |d   |d   |j                  d      d}|j                  |       n ||d<   |S # |j                  $ r Y w xY w)	z9Custom representation to format individual accommodationsr   )Property)r>   r   r(   r   )r#   r%   r   r(   r   r2   )superto_representationr2   properties.modelsrd   rX   rN   r   intnameappendDoesNotExist)
r   r[   dataaccommodations_listrd   r#   settingsproperty_objrb   	__class__s
            r   rf   z+ChannelSettingsSerializer.to_representation   s    w(2 !--2)1)K)K)Q)Q)S%X#+#3#3#7#73{;K#7#LL'*;'7)5):):(0(@)1/)B.6ll;O.P*& (../AB *T -@()	  ,, s   A&B55CC)r   r   r    r!   r   	ListFieldr   r2   rD   rF   r   rO   r\   rR   rf   __classcell__)rp   s   @r   r9   r9       sX    2 T 5 5 5/18	!> >$   $ r   r9   c                   t    e Zd ZdZ ej
                  dd      Z ej                         Z G d d      Z	d Z
y)	 ChannelSettingsSummarySerializerz2Simplified serializer for channel settings summaryzstructure.nameT)sourcer   c                       e Zd ZeZg dZy)%ChannelSettingsSummarySerializer.Meta)
r>   r.   structure_namer/   r0   r3   r4   r5   total_individual_accommodationsr@   N)r   r   r    r	   rA   rB   r*   r   r   rD   rw      s    
r   rD   c                 H    |j                   rt        |j                         S dS )z&Get count of individual accommodationsr   )r2   len)r   objs     r   #get_total_individual_accommodationszDChannelSettingsSummarySerializer.get_total_individual_accommodations   s!    585R5Rs3001YXYYr   N)r   r   r    r!   r   r$   rx   SerializerMethodFieldry   rD   r}   r*   r   r   rt   rt      s;    <*[**2BdSN&Gk&G&G&I#
 
Zr   rt   )rest_frameworkr   django.utilsr   drf_spectacular.utilsr   r   modelsr   r	   
Serializerr   ModelSerializerr9   rt   r*   r   r   <module>r      s    & ! J .(>(> 4 &(2)*.2 ()(2)*.:	. '(%&&'	
0y ; ; y10yvZ{'B'B Zr   