
    iJ              	          d dl mZ d dlmZ d dlmZmZ d dlZd dlmZ d dl	Z	 G d d      Z
edk(  rd	Zd
Z	  e
ee      Z eej                        ZdZdZdZ eddddd d e      Zej+                  eeee      Z ee       e	j0                  Ze	j4                  Zej9                  ee      Z ee        eed         Z ee        eed   d           ed   d    d   d   ZejA                  e      Z! e"        	 dZ eddddd d e      ZejG                  ee      Z e"        dZ$ejK                  ee$      Z&e&dk(  rejO                  ee$       ejQ                  ee$      ZejS                  d      Z*e*s	 ed       y ed       e*D ]F  Z+e+d   jY                  de+d   jY                  d            Z- ee- d e+jY                  d!d"              H yy)#    )build)service_account)datetime	timedeltaN)ZoneInfoc                       e Zd Zd dededefdZd ZdefdZd Zd	 Zd
 Z	d Z
d!dedefdZd Zd Zd"dedefdZd#dedefdZd Zd$defdZdej(                  fdedefdZd Zd Zy)%GoogleCalendarClientservice_account_filecalendar_idtimezonec                 X    || _         || _        || _        | j                         | _        y)u;  
        Inicijalizacija Google Calendar klijenta.

        :param service_account_file: Putanja do JSON service account ključa
        :param calendar_id: ID kalendara (npr. 'primary' ili 'fitandmore-calendar@...gserviceaccount.com')
        :param timezone: Naziv vremenske zone (default: Europe/Zagreb)
        N)r
   r   r   _build_serviceservice)selfr
   r   r   s       /var/www/api/v1/app_calendar.py__init__zGoogleCalendarClient.__init__   s+     %9!& **,    c                 ~    dg}t         j                  j                  | j                  |      }t	        dd|      }|S )zQPrivatna metoda za autentifikaciju i inicijalizaciju Google Calendar API servisa.z(https://www.googleapis.com/auth/calendar)scopescalendarv3)credentials)r   Credentialsfrom_service_account_filer
   r   )r   SCOPEScredsr   s       r   r   z#GoogleCalendarClient._build_service   sH     ==++EE%%f F 
 
De<r   emailc                 v   | j                   j                         j                  | j                        j	                         j                  dg       }|D ]b  }|j                  d      d| k(  r|d   c S |j                  di       }|j                  d      dk(  sH|j                  d      |k(  s]|d   c S  y )	N
calendarIditemsidzuser:scopetypeuservalue)r   acllistr   executeget)r   r   	acl_itemsruler#   s        r   get_rule_id_for_userz)GoogleCalendarClient.get_rule_id_for_user"   s    LL$$&++t7G7G+HPPRVVW^`bc	Dxx~50Dz!HHWb)Eyy F*uyy/AU/JDz!  r   c                     | j                   j                         j                         j                         }|j	                  dg       S )u7   Vrati listu svih kalendara dostupnih servisnom računu.r!   )r   calendarListr(   r)   r*   )r   results     r   list_calendarsz#GoogleCalendarClient.list_calendars-   s7    **,113;;=zz'2&&r   c                    | j                   j                         j                  |      j                         }t	        d       |j                  dg       D ]'  }t	        d|d    d|d    d       ||d	   d
   k(  s' y y)Nr   zTrenutna ACL pravila:r!   z- r"   z (role)r#   r&   TF)r   r'   r(   r)   printr*   )r   r   user_accountr'   r,   s        r   share_checkz GoogleCalendarClient.share_check2   s    ll %%%=EEG%&GGGR(DBtDzl"T&\N!45tG}W55 )
 r   c                     d|ddd}| j                   j                         j                  ||      j                         }t	        d|d          y)	a   SCOPES = ['https://www.googleapis.com/auth/calendar']
        credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES
            )

        service = build('calendar', 'v3', credentials=credentials) r%   )r$   r&   owner)r#   r3   r    bodyzKalendar podijeljen s:r"   T)r   r'   insertr)   r5   )r   r   google_accountr,   created_rules        r   share_calendarz#GoogleCalendarClient.share_calendar>   s[     ' 
 ||'')00Kd0S[[]&T(:;r   c                    	 | j                   j                         j                  |      j                         }d }| j	                  |      }|rH| j                   j                         j                  ||      j                          t        d|z          yt        d       	 y# t        $ r}t        d|       Y d }~yd }~ww xY w)Nr   )r    ruleIdzObrisano dijeljenje za TzNema takvog dijeljenja.u!   Greška pri brisanju ACL pravila:F)r   r'   r(   r)   r-   deleter5   	Exception)r   r   r6   r'   rule_ides         r   share_deletez!GoogleCalendarClient.share_deleteR   s    	:,,""$))[)AIIKCG//=G  "))[)QYY[/<?@/0   	:5q99	:s   BB$ B$ $	C-B>>CNdescriptionlocationc                    i }d|d<   i |d<   	 |}t        |      }t        t        j                  j	                  |d            }t        t        j
                  j	                  |d            }	||	z   }
t        j                  |d      }|t        |
      z   }||||j                         | j                  d|j                         | j                  dd}| j                  j                         j                  t        j                  |	      j                         }||d<   |S # t         $ r}t#        |      |d<   Y d }~|S d }~ww xY w)
NFerroreventr   z%Y-%m-%d %H:%Mhours)dateTimetimeZone)summaryrG   rH   startendr:   )intfloatapp_settingstermin_duration_hr*   clean_duration_hr   strptimer   	isoformatr   r   eventsr<   CALENDAR_IDr)   rC   str)r   rP   
start_time
service_idrG   rH   retblock_starttermin_durationclean_durationduration_total	block_endrK   event_resultrE   s                  r   	add_eventzGoogleCalendarClient.add_eventd   s8   GG	"$KZJ#L$B$B$F$FzST$UVO"<#@#@#D#DZQR#STN,~=N"++K9IJK#in&EEI #*$&1&;&;&=4==Y$-$7$7$9t}}UE  <<..077<C[C[bg7hpprL'CL
 
	  	"q6CL
		"s   DD# #	E,E  Ec                     | j                   j                         j                  | j                  |d|i      j	                         }|S )NrH   )r    eventIdr;   )r   rZ   patchr   r)   )r   event_id
new_statusupdated_events       r   update_event_statusz(GoogleCalendarClient.update_event_status   sL    ++-33''j) 4 
 ')	 	 r   c                     | j                   j                         j                  | j                  |      j	                         }|j                  d      }|S )Nr    rh   rH   )r   rZ   r*   r   r)   )r   rj   rK   rH   s       r   get_event_locationz'GoogleCalendarClient.get_event_location   sQ    ##%))'' * 
 ') 	 99Z(r   r   
days_ahead	days_backc                    t        j                  | j                        }t        j                  |      }|t	        |      z
  j                         }|t	        |      z   j                         }| j                  j                         j                  | j                  ||dd      j                         }|j                  dg       S )u  
        Dohvaća sve evente u zadanom vremenskom intervalu.

        :param days_ahead: Koliko dana unaprijed čitati (default 7)
        :param days_back: Koliko dana unatrag čitati (default 0)
        :return: Lista eventova (dict objekti iz Google API-ja)
        daysT	startTimer    timeMintimeMaxsingleEventsorderByr!   )pytzr   r   nowr   rY   r   rZ   r(   r   r)   r*   )r   rq   rr   tzr}   time_mintime_maxevents_results           r   get_events_OLDz#GoogleCalendarClient.get_events_OLD   s     ]]4==)ll2)33>>@)44??A++-22'' 3 
 ') 	   "--r   	first_dayc                    i }d|d<   	 t        j                  | j                        }t        j                  |      j	                  dddd      t        |      z   }|j                         }t        j                  |      j	                  dddd      t        |      z   j                         }| j                  j                         j                  | j                  ||d	d
      j                         }|j                  dg       }	|	sg |d<   |S g }
ddlm} |	D ]  }|d   j                  d|d   j                  d            }|d   j                  d|d   j                  d            }|j                  |      }|j                  |      }|t        d      z
  }|j                         }||d   d<   |
j!                  |        	 |
|d<   |S # t"        $ r}d|d<   |cY d}~S d}~ww xY w)uV   
        Dohvaća sve evente iz Google kalendara u idućih `days_ahead` dana.
        NrJ      r   hourminutesecondmicrosecondrt         Trv   rw   r!   rZ   parserrQ   rN   daterR      )minutesu-   ⚠️ Greška pri dohvaćanju događaja: {e})r|   r   r   r}   replacer   rY   r   rZ   r(   r   r)   r*   dateutilr   isoparseappendrC   )r   r   rq   r_   r~   r}   r   r   r   rZ   
events_newr   rK   	start_strend_strstart_dtend_dtnew_start_dtnew_start_isorE   s                       r   get_events_in_rangez(GoogleCalendarClient.get_events_in_range   s   
 GA	t}}-B,,r"**!AST*UXagpXqqC}}H R(00b1Z[0\_hnx_yy  E  E  GH !LL//166++  !# 7  gi  #&&w3F "H
 J'!'N..z5>;M;Mf;UV	,**:uU|7G7G7OP "??951  ()B*?? !- 6 6 8 .;gz* !!%('  (- 'CMJ 	JCLJ	s%   DG B>G 	G*G%G*%G*c                     i }d |d<   	 | j                   j                         j                  | j                  |      j	                          |S # t
        $ r}t        |      |d<   |cY d }~S d }~ww xY w)NrJ   ro   )r   rZ   rB   r   r)   rC   r\   )r   rj   r_   rE   s       r   delete_event_by_idz'GoogleCalendarClient.delete_event_by_id   sq    G
	LL!((++  )  giJ 	q6CLJ	s   AA 	A1A,&A1,A1summary_filterc                    	 t         j                  t         j                  z   }|t        |      z   }|j	                         }|j	                         }| j
                  j                         j                  | j                  ||dd      j                         }|j                  dg       }|st        d       yd}	|D ]  }
|
d   }|
j                  d	d
      }|r||k7  rt        d| d| d       4| j
                  j                         j                  | j                  |      j                          t        d| d| d       d}	 |	st        d       |	S # t        $ r}t        d|        Y d}~yd}~ww xY w)u~   
        Briše Google Calendar event ako postoji u zadanom terminu i (opcionalno) ima zadani naziv (summary_filter).
        rL   Trv   rw   r!   u-   ℹ️ Nema eventa u tom terminu za brisanje.Fr"   rP   z(bez naziva)u   ⏭️ Preskačem event 'u   ' — ne odgovara nazivu 'z'.ro   u   🗑️ Obrisao event: z (ID: r4   uA   ℹ️ Nije pronađen nijedan event koji odgovara nazivu filtera.u$   ⚠️ Greška pri brisanju eventa: N)rU   TERMIN_DURATIONCLEAN_DURATIONr   rY   r   rZ   r(   r   r)   r*   r5   rB   rC   )r   r]   r   duration_hoursend_timer   r   r   rZ   deletedrK   rj   event_summaryrE   s                 r   delete_event_by_time_OLDz-GoogleCalendarClient.delete_event_by_time_OLD  s   /	)99L<W<WWN!IN$CCH "++-H))+H !LL//166++  !# 7  gi  #&&w3FEFG ; %		)^ D "m~&E5m_D^_m^nnpqr ##%,,#//$ -  ')/fXJaPQ  " YZN 	8<=	s   B5E 8BE 	E9!E44E9no_day	time_stepc                 Z   t        j                         j                  dddd      t        |      z   }t        j                         j                  dddd      t        |      z   }t        |      }|}g }||k  r-| j	                  |      r|j                  |       ||z  }||k  r-|S )Nr   r   r   rt   r   r   rL   )r   r}   r   r   is_calendar_freer   )r   r   r   starting_timeending_timestepcurrent_time
free_slotss           r   check_avialable_day_OLDz,GoogleCalendarClient.check_avialable_day_OLDD  s     !..AaWX.Y\ekq\rrlln,,"QqVW,X[djp[qqy)$
[($$\2!!,/D L [(
 r   c                 *   t        j                  | j                        }|j                  |j                  |      }t        j
                  j                  |      }t        j                  j                  |      }||z   }|t        |      z   }|j                         }|j                         }	| j                  j                         j                  | j                  ||	dd      j                         }
|
j                  dg       }t        |      dk(  S )NrL   Trv   rw   r!   r   )r|   r   tzinfolocalizerU   rV   r*   rW   r   rY   r   rZ   r(   r   r)   len)r   r^   r]   r~   ra   rb   r   r   r   r   r   rZ   s               r   r   z%GoogleCalendarClient.is_calendar_freeX  s    ]]4==)$Z0J&88<<ZH%66:::F(>9	 ?? '')%%' ++-22'' 3 
 ') 	 ""7B/ 6{ar   c                     ddl m} |j                  |      }t        j                  j                  |      }|t        |      z
  }|j                         }|S )Nr   r   rL   )r   r   r   rU   rW   r*   r   rY   )r   r^   r]   r   dtrb   cleaning_timenew_date_isos           r   add_cleaning_timez&GoogleCalendarClient.add_cleaning_timew  sT    # __Z( &66:::FY^<< %..0 r   )zEurope/Zagreb)NN)   r   )r      )N)__name__
__module____qualname__r\   r   r   r-   r1   r7   r?   rF   rf   rm   rp   rS   r   r   r   r   rU   TERMIN_STEPrT   r   r   r    r   r   r	   r	   
   s    -S -s -c -	# 	'

($ c  \_  D. .S .0HS H HT 33 3p 56+7+C+Cc #(( >r   r	   __main__zfitandmore-715a01004911.jsonprimary)r
   r   zRezervacija saune - User #14z Test opisaPrenotedi  
         )r   rZ   rQ   rN   zRezervacija saune - User 123   zmandul111@gmail.comFr   )rq   u!   
Nema događaja u idućih 7 dana.u   
Događaji u idućih 7 dana:r   u    — rP   z(bez naslova)).googleapiclient.discoveryr   google.oauth2r   r   r   r|   zoneinfor   rU   r	   r   SERVICE_ACCOUNT_FILEr[   gcr   r~   rP   rG   rH   r]   rf   r_   r5   
DELAY_DAYSr   
TOTAL_DAYSrq   r   r   nostart_eventr   ret2exitdelete_event_by_timer6   share_checkj	ret_sharer?   rF   
get_eventsrZ   rK   r*   rQ   r   r   r   <module>r      s    + ) (   | |N z9KC 
1
B 
"++	B -GKH $BAq<J ,,w
K
BC	#J ''I((J

 
 J
7C	#J	S]	B	"I	#h-
h-"7+J7K,DF -G$BAq<J

!
!*g
6CF 'LL9I %
+|4
//+l
3C ]]a](F23-.E'N&&z5>3E3Ef3MNEUG59o!F GHI ] r   