
    7>h=              
          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
mZmZmZ d dlmZmZmZ d dl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# d dl$m%Z%  e       Z& ejN                  e(      Z)defdZ* G d de      Z+e&jY                  dejZ                         ed       ee       ee%      fdee.ef   dedefd       Z/e&jY                  dee.ef          ed       ee       ee%      fdee.ef   dedefd       Z0e&jc                  dejZ                         ed       ee       ee%      fde2dee.ef   dedefd       Z3e&ji                  d       ee       ee%      fde2dedefd       Z5e&jY                  de
ee.ef             ee6       ee       ee%      fde+dedefd        Z7e&jY                  d!       ee       ee%      fdedefd"       Z8e&jY                  d#       ee       ee%      fd$e2dedefd%       Z9e&ju                  d&       ee%      fdefd'       Z;e&ju                  d(e
ee.ef             edd)*       ee       ee%      fd+e.d,ee   dedefd-       Z"e&jY                  d.e
ee.ef             ed       ee       ee%      fd/ee.ef   dedefd0       Z<e&jY                  d1ee.ef          ed       ee       ee%      fd2ee.ef   dedefd3       Z=y)4    )	APIRouterDependsHTTPExceptionstatusBodyQuery)Session)ListDictAnyOptional)datetimedate	timedeltaN)	BaseModel)get_db)schemasmodels   )
create_advisor_scheduleupdate_advisor_scheduledelete_advisor_scheduleget_advisor_schedulesrefresh_all_advisor_statusescreate_bulk_advisor_schedulesupdate_advisor_statusSHIFTSget_advisors_by_shift"get_available_advisors_at_datetime)verify_token_internallycurrent_userc                     d }t        | t              r8| j                  d      }|s%d| v r!| j                  di       j                  d      }|dvrt        t        j
                  d      y )Ntypeuser)manageradminz&Only managers can access this resourcestatus_codedetail)
isinstancedictgetr   r   HTTP_403_FORBIDDEN)r!   	user_types     G/var/www/html/DP/alpha_backend/app/advisor_service/routers/schedules.pycheck_manager_roler0   &   so    I,% $$V,	V|3$((488@I,,11;
 	
 -    c                   J    e Zd ZU dZee   ed<   dZee   ed<   dZ	ee   ed<   y)ScheduleFilterParamsN
advisor_id
start_dateend_date)
__name__
__module____qualname__r4   r   int__annotations__r5   r   r6    r1   r/   r3   r3   5   s,     $J$!%J%#Hhtn#r1   r3   z
/schedules)response_model.schedule_datadbc                 x  K   t        |       |j                  d      }|s!|j                  di       j                  d      }|st        t        j                  d      	 t        j                  di | }t        |||      S # t        $ r,}t        t        j                  dt        |             d}~ww xY ww)	a  
    Create a new advisor schedule (manager only)
    
    Expects a JSON object:
    {
        "advisor_id": 1,
        "shift_period_start": "2023-06-01",
        "shift_period_end": "2023-06-07",
        "shift": "SHIFT_1",
        "advisor_status": true
    }
    user_idr$   id8Could not determine manager ID from authentication tokenr'   Invalid schedule data: Nr<   )r0   r,   r   r   HTTP_401_UNAUTHORIZEDr   AdvisorScheduleCreate	ExceptionHTTP_400_BAD_REQUESTstrr   )r>   r?   r!   
manager_idschedule_createes         r/   create_schedulerM   ;   s     & |$ !!),J!%%fb155d;
44M
 	

!77H-H #2
CC  
33,SVH5
 	

s*   AB: B 5B:	B7'B22B77B:z/schedules/bulk	bulk_datac                 ,  K   t        |       |j                  d      }|s!|j                  di       j                  d      }|st        t        j                  d      | j                  dg       }|rt        |t              st        t        j                  d      | j                  d      | j                  d	      | j                  d
      | j                  dd      d}t        ||||      }dt        |d          dt        |d          d|dS w)a&  
    Create schedules for multiple advisors at once (manager only)
    
    Expects a JSON object:
    {
        "advisor_ids": [1, 2, 3],
        "shift_period_start": "2023-06-01",
        "shift_period_end": "2023-06-07",
        "shift": "SHIFT_1",
        "advisor_status": true
    }
    rA   r$   rB   rC   r'   advisor_idsz$advisor_ids must be a non-empty listshift_period_startshift_period_endshiftadvisor_statusT)rQ   rR   rS   rT   zCreated schedules for success advisors, failed failedmessageresults)
r0   r,   r   r   rE   r*   listrH   r   len)rN   r?   r!   rJ   rP   base_scheduler[   s          r/   create_bulk_schedulesr_   h   s     & |$ !!),J!%%fb155d;
44M
 	
 --r2Kjd;339
 	
 (mm,@A%MM*<=w'#--(8$?	M ,B]JWG ,C	0B,C+DKPST[\dTePfOggno s   DDz/schedules/{schedule_id}schedule_idc                 z  K   t        |       |j                  d      }|s!|j                  di       j                  d      }|st        t        j                  d      	 t        j                  di |}t        || ||      S # t        $ r,}t        t        j                  dt        |             d}~ww xY ww)	a  
    Update an existing advisor schedule (manager only)
    
    Expects a JSON object with fields to update:
    {
        "shift_period_start": "2023-06-01",
        "shift_period_end": "2023-06-07",
        "shift": "SHIFT_2",
        "advisor_status": false
    }
    rA   r$   rB   rC   r'   rD   Nr<   )r0   r,   r   r   rE   r   AdvisorScheduleUpdaterG   rH   rI   r   )r`   r>   r?   r!   rJ   schedule_updaterL   s          r/   update_schedulerd      s     & |$ !!),J!%%fb155d;
44M
 	

!77H-H #2{OZPP  
33,SVH5
 	

s*   AB; B 5B;	B8'B33B88B;c                 8   K   t        |       t        ||       S w)z3
    Delete an advisor schedule (manager only)
    )r0   r   )r`   r?   r!   s      r/   delete_schedulerf      s      |$ #2{33s   z/all-schedules)default_factoryfiltersc                   K   t        |       | j                  r| j                  ryt        j                  | j                  t        j
                  j                               }t        j                  | j                  t        j                  j                               }n%t        j                         }|t        d      z
  }|}t        || j                  ||      S w)zI
    Get advisor schedules with optional JSON filters (manager only)
       )weeks)r0   r5   r6   r   combinemintimemaxnowr   r   r4   )rh   r?   r!   start_datetimeend_datetimetodays         r/   get_schedulesrt      s      |$ g..!))'*<*<hll>O>O>QR''(8(8(,,:K:K:MN !33 !W%7%7VVs   CCz/schedules/refreshc                 6   K   t        |       t        |       S w)zT
    Refresh the status of all advisors based on their schedules (manager only)
    )r0   r   )r?   r!   s     r/   refresh_advisor_statusesrv      s      |$ (++s   z'/schedules/advisor/{advisor_id}/refreshr4   c                 D   K   t        |       t        ||       }d| |dS w)zW
    Refresh the status of a single advisor based on their schedule (manager only)
    zAdvisor status refreshed)rZ   r4   in_shift)r0   r   )r4   r?   r!   rx   s       r/   refresh_single_advisor_statusry     s3      |$ %R4H .  s    z/shiftsc                    K   i }t        j                         D ]5  \  }}|d   |d   j                  d      |d   j                  d      d||<   7 |S w)z0
    Get available shifts and their timings
    namestartz%H:%Mend)r{   r|   r}   )r   itemsstrftime)r!   formatted_shifts	shift_key
shift_infos       r/   
get_shiftsr     sf      !'	:v&(11':e$--g6'
# "0 s   AAz/shifts/{shift}/advisorsz!Date to check (defaults to today))descriptionrS   r   c                   K   t        |       |xs" t        j                         j                         }t        j                  |t        j
                  j                               }|j                  t        j                        j                  t        j                  j                  | k(  t        j                  j                  |k  t        j                  j                  |k\  t        j                  j                  dk(        j                         }g }|D ]  }|j                  t        j                         j                  t        j                   j"                  |j$                  k(        j'                         }	|	sg|j)                  |	j"                  |	j*                  |	j,                  |	j.                  |	j0                  |j"                  |j                  |j                  |j                  d	        |S w)z
    Get all advisors scheduled for a specific shift on a given date
    
    Returns a list of advisors with their schedule details
    T)	r4   	full_nameemailphone_numberr   r`   rS   rQ   rR   )r0   r   rp   r   rl   rm   rn   queryr   AdvisorSchedulefilterrS   rQ   rR   rT   allAdvisorrB   r4   firstappendr   r   r   r   )
rS   r   r?   r!   
check_datecheck_datetime	schedulesresultscheduleadvisors
             r/   r   r   1  s}     |$ .,,.J %%j(,,2C2C2EFN //077$$-11^C//>A--5	
 
ce  F((6>>*11NN!4!44

%' 	 MM%jj$..  ' 4 4!..'{{!&.&A&A$,$=$=
 
 $ Ms   E9G5<A9G5z/schedules/available-advisorsdatac                 `  K   t        |       | j                  d      }|st        t        j                  d      	 t        j                  |d      }t        ||      S # t        $ rC 	 t        j                  |d      }n(# t        $ r t        t        j                  d      w xY wY Ww xY ww)z
    Get advisors available at a specific date and time
    
    Expects a JSON object:
    {
        "datetime": "2025-03-15 15:00"  # Format: YYYY-MM-DD HH:MM (24-hour format)
    }
    
    Returns a list of advisors with their IDs and statuses
    r   zdatetime field is requiredr'   z%Y-%m-%d %H:%Mz%Y-%m-%d %I:%M%pz^Invalid datetime format. Use 'YYYY-MM-DD HH:MM' (24-hour) or 'YYYY-MM-DD HH:MMam/pm' (12-hour))	r0   r,   r   r   rH   r   strptime
ValueErrorr   )r   r?   r!   datetime_strr   s        r/   get_available_advisorsr   d  s     " |$ 88J'L33/
 	
!**<9IJ .b.AA  	%..|=OPN 	"77w 	 s@   :B.A B.	B+)B ?B+ %B%%B+(B.*B++B.z/schedules/individualschedules_datac                   K   t        |       |j                  d      }|s!|j                  di       j                  d      }|st        t        j                  d      | j                  dg       }|rt        |t              st        t        j                  d      g g d}|D ]I  }	 t        j                  di |}t        |||      }|d	   j                  |d
   |j                  d       K dt        |d	          dt        |d          d|dS # t        $ r9}	|d   j                  |j                  d
      t        |	      d       Y d}	~	d}	~	ww xY ww)al  
    Update schedules for individual advisors (manager only)
    
    Expects a JSON object:
    {
        "schedules": [
            {
                "advisor_id": 1,
                "shift_period_start": "2023-06-01",
                "shift_period_end": "2023-06-07",
                "shift": "SHIFT_1",
                "advisor_status": true
            },
            {
                "advisor_id": 2,
                "shift_period_start": "2023-06-02",
                "shift_period_end": "2023-06-08",
                "shift": "SHIFT_2",
                "advisor_status": false
            }
        ]
    }
    rA   r$   rB   rC   r'   r   z"schedules must be a non-empty list)rU   rW   rU   r4   )r4   r`   rW   )r4   errorNzUpdated schedules for rV   rX   rY   r<   )r0   r,   r   r   rE   r*   r\   rH   r   rF   r   r   rB   rG   rI   r]   )
r   r?   r!   rJ   r   r[   r   rK   new_schedulerL   s
             r/   update_individual_schedulesr     s}    < |$ !!),J!%%fb155d;
44M
 	
 "";3IJy$7337
 	
 G
 	%;;GhGO 32
SLI%%&|4+'  ( ,C	0B,C+DKPST[\dTePfOggno   	H$$&ll<8Q&  	s1   B&E)AD/&E	E/EEEE)>fastapir   r   r   r   r   r   sqlalchemy.ormr	   typingr
   r   r   r   r   r   r   loggingpydanticr   app.common.databaser   
app.commonr   r   services.schedule_servicer   r   r   r   r   r   r   r   r   r   "auth_service.services.auth_servicer    router	getLoggerr7   loggerr0   r3   postr   rI   rM   r_   putr:   rd   deleterf   r+   rt   rv   ry   r,   r   r   r   r<   r1   r/   <module>r      sd   K J " , , . .   & &   G				8	$
T 
$9 $ \'*A*AB$(I&/ !89)DS>)D)D )D C)DX tCH~> $S	&/ !896CH~66 6 ?6r &w7N7NO %)I&/ !89	)Q)QS>)Q 	)Q 	)Q P)QX )* &/ !89444 4 +4 d4S>.BC$($>&/ !89W!WW W DW2 !"&/ !89,,, #, 67 &/ !89  8* I !89 $ &tDcN7KL !3VW&/ !89	00
4.0 	0 	0 M0d ,T$sCx.=QR9&/ !89)B
sCx.)B)B )B S)BV $T#s(^D%)#Y&/ !89NcNNN N ENr1   