<?php
namespace RinnovoBooking\Core;

use RinnovoBooking\Core\RinnovoBookingService;
use DateTime;   

class iPatenteService {

    private $ipatente_api_key;
    private $ipatente_url;
    private $rinnovo_booking_service;

    
    /**
     * Costruttore della classe iPatenteService
     */
    public function __construct() {
        $giorno = date('d');
        $mese = date('m');
        $anno = date('Y');
        $this->ipatente_api_key = $mese.$giorno."o6(xiSDa%n8A~o:+gn2S5Xj`])+qU*qE]WoT!~926(zi.7N[>`-v}?#aEmqVXEJ7@zN_LU+JU~,4WN6b8:8xiEv)Ey'`Fp)(Tpd'RRDs}+Vzsta(5{[s{NPS?d%f(NcHn~HiQNPxc_g_o55KT'uoD^~se9P.FZCm3(A_YVdXKftgBAm{.;9y6^.8knAr'+;-XzF#sy-}hF6JWSo:xRaP(dE)_rEt(.-uo^2BPjLVA42ye)M,dsVpnHQ9dCtk6z%xN[bKf?x%T`F;Yn{Nz+a'Rqm]FC[;:jwh2w]MFhA/rX3gZqw94>;HweTsCX-/9aTtGyNz!W)E_,Z_KBH_N.Dry`~r*i@]*>px;hzDDEGkH:fx.Dx@'8@Jp?#}^t~6jmQNKXXHFy.dJY{:j!kC%8n~;2{*d~3B;_hE3-43XLP]9ohV;@4PM@FL{]]69[em(XN[S8t&3B{u%);y>s+`a'+}rJT[JqREEw:rkh`8,8c:(RTS)*C(>;FvQzimY^R+kB>PfzrC[D.6bb;bKs=.{ZvqBsD}9JEqkmjebSeeVW5]NBS)Lj&xN2ALir?gx7/FLgTi.32A7BX6JF%Qy(x.)/bQ5!}fSsVA7ypU3oHqQ+]#gDpei{cR`C[Q68_9ne;cnF&{@iG^d7gNusQ~759ax4'G^/,+,U[%L+3zS}VZ]eS6g`zhn(suzwh9Xu3=4etS^]]bRF{(d8?>iG;?nT}ZKP&gQw&[dP'E8+e:))[hJmNG7Het(Cm,Ja.>LXBt>jJUny~AQVA55PW@9erFD`H{M%xB7F66r8Xzh{5E;N[%#s.VH64^GT(srRKN?`SPUXssL!(ip6Zaq.m;=TEtnK5/aoFz:dnD9Q2CrjN(-D3KJwa,'+&Pg(tf5uN-2ZnRJ-SeZJb%kL9EJi%](h_A;-rhdth2sHaP,?Qv~x]azQq{]Yn_kc'A*hR3>,;*:+bM:;HwqQ/+-RFcW-?)}F?BWc[QLt=Cc..hGVhNr6sXm(6ZQ?K:Gq=zm]E)`Du:[;%HWUWK=rFB/^}LGqaEG4)&%S8Z6.^'M&{]Ypa&xjD}82W(MHTmwuG}jysg5}%G,]co/2#%Yx&`EgGf!;p,4%r!q_V>+(F!hMK[:S#xqr>(6>!{vTBrX-w'Q)+]Ma4kXURNRq7kF9*]4`cXf,&Ke;_hcF3vg7[=6tX:'S6q".$anno;
        $this->ipatente_url = "https://desktop.ipatente.app/api/autoscuolenelweb/visite/prenotazioni.php?clientid=";
        $this->rinnovo_booking_service = new RinnovoBookingService();
    }


    /**
     * Summary of getGenerateCalendar
     * @param mixed $sede
     * @param mixed $gruppo
     * @return array[]
     */
    public function getGenerateCalendar($sede, $gruppo) {

        $ipServer = $_SERVER['SERVER_ADDR'];

        $ipatente_data = array(
            'sede' => $sede,
            'gruppo' => $gruppo,
            'ip_origine'=> $ipServer
        );

        $ipatente_data = $this->rinnovo_booking_service->rinnovo_booking_CURLBearer_GET($this->ipatente_url.$gruppo, $this->ipatente_api_key);
        $ipatente_data_array = json_decode($ipatente_data, true);
        $this->rinnovo_booking_service->saveIPatenteApi($ipatente_data, $sede, 'getGenerateCalendar', $_SERVER['REMOTE_ADDR']);

        if(!$ipatente_data_array["success"]) {
			echo '<div><hr>Errore interfacciamento DataBase.<br>Riprova tra qualche minuto.<hr></div>'.PHP_EOL;
            $disponibilita = '';
            $occupati = '';
            $apertura = '';
            $chiusura = '';   
        } else {
            $disponibilita = $this->getAvailability($ipatente_data_array, $sede);
            $occupati = $this->getBusy($ipatente_data_array, $sede);
            $apertura = $this->getApertura($ipatente_data_array, $sede);
            $chiusura = $this->getChiusura($ipatente_data_array, $sede);     
        }

        return array(
            'disponibilita' => $disponibilita,
            'occupati' => $occupati,
            'apertura' => $apertura,
            'chiusura' => $chiusura
        );

    }


    /**
     * Summary of getAvailability
     * @param mixed $ipatente_data
     * @param mixed $sede
     * @return array[]
     */
    public function getAvailability($ipatente_data, $sede) {
        $orari_medico = $ipatente_data['data']['orari_medico'][$sede] ?? [];
        $max_slot = $ipatente_data['data']['mostra_disponibilita'][$sede] ?? 0;
        $minutes_slots = $ipatente_data['data']['durata_slot'][$sede] ?? 0;
        
        $giorni_settimana = [
            'LUN' => 'Lunedì',
            'MAR' => 'Martedì',
            'MER' => 'Mercoledì',
            'GIO' => 'Giovedì',
            'VEN' => 'Venerdì',
            'SAB' => 'Sabato',
            'DOM' => 'Domenica'
        ];
        
        $disponibilita = [];
        foreach ($orari_medico as $orario) {
            if(isset($giorni_settimana[$orario['giorno']])) {
                $disponibilita[] = [
                    'day_of_week' => $giorni_settimana[$orario['giorno']],
                    'start_time' => $orario['apertura'],
                    'end_time' => $orario['chiusura'],
                    'max_slots' => $max_slot,
                    'minutes_slots' => $minutes_slots
                ];
            }
        }
        
        return $disponibilita;
    }       


    /**
     * Summary of getBusy
     * @param mixed $ipatente_data
     * @param mixed $sede
     * @return array[]
     */
    public function getBusy($ipatente_data, $sede) { 
        $prenotati = $ipatente_data['data']['prenotazioni'][$sede]['visite'] ?? [];

        $occupati = [];
        foreach ($prenotati as $prenotato) {
            $dataOra = explode(' ', $prenotato);
            $occupati[] = [
                'date' => $dataOra[0],
                'time' => $dataOra[1]
            ];
        }
        
        return $occupati;
    }


    /**
     * Summary of getApertura
     * @param mixed $ipatente_data
     * @param mixed $sede
     * @return array[]
     */
    public function getApertura($ipatente_data, $sede) {
        
        $orari_medico = $ipatente_data['data']['orari_medico'][$sede] ?? [];
        $max_slot = $ipatente_data['data']['mostra_disponibilita'][$sede] ?? 0;
        $minutes_slots = $ipatente_data['data']['durata_slot'][$sede] ?? 0;
        
        $giorni_settimana = [
            'LUN' => 'Lunedì',
            'MAR' => 'Martedì',
            'MER' => 'Mercoledì',
            'GIO' => 'Giovedì',
            'VEN' => 'Venerdì',
            'SAB' => 'Sabato',
            'DOM' => 'Domenica'
        ];
        
        $apertura = [];
        foreach ($orari_medico as $orario) {
            if(!isset($giorni_settimana[$orario['giorno']])) {
                $apertura[] = [
                    'day_of_week' => $orario['giorno'],
                    'start_time' => $orario['apertura'],
                    'end_time' => $orario['chiusura'],
                    'max_slots' => $max_slot,
                    'minutes_slots' => $minutes_slots
                ];
            }
        }
        
        return $apertura;
    }


    /**
     * Summary of getChiusura
     * @param mixed $ipatente_data
     * @param mixed $sede
     * @return array[]
     */
    public function getChiusura($ipatente_data, $sede) { 
        $pieni = $ipatente_data['data']['prenotazioni'][$sede]['completo'] ?? [];
        
        $occupati = [];
        foreach ($pieni as $pieno) {
            $dataOra = explode(' ', $pieno);
            $occupati[] = [
                'day_of_week' => $dataOra[0]
            ];
        }
        return $occupati;
    }


    /**
     * Summary of registerOnIPatente
     * @param mixed $data
     * @return bool
     */
    public function registerOnIPatente($data) {

        $posizione = strpos($data['sede'],'_');
        $dataIPatente = DateTime::createFromFormat('d/m/Y', $data['PrenotaData'])->format('Y-m-d');

        $tipo_visita = [
            'conseguimento' => 1,
            'rinnovo' => 2,
            'porto_d_armi' => 3,
            'estensione' => 4,
            'duplicato_documento' => 5,
            'rinnovo_patente_nautica' => 6
        ];

        $field = '&id_autoscuola='.str_replace('s','',substr($data['sede'],0,$posizione)).
                 '&id_matricola='.str_replace('m','',substr($data['sede'],$posizione+1)).
                 '&tipo='.$tipo_visita[$data['tipo_visita']].
                 '&cognome='.$data['cognome'].
                 '&nome='.$data['nome'].
                 '&orario='.$data['PrenotaOra'].
                 '&data='.$dataIPatente.
                 '&email='.$data['email'].
                 '&telefono=%2b39'.$data['telefono'].
                 '&patente='.$data['npatente'];

        $ipatente_data = $this->rinnovo_booking_service->rinnovo_booking_CURLBearer($this->ipatente_url.$data['gruppo'], $this->ipatente_api_key, $field);
        $ipatente_data_array = json_decode($ipatente_data, true);

        if(!$ipatente_data_array["success"]) {
            return false;
		} else {
            return true;
        }
    }

}