---------------------------------
-- Script de lecture de calendrier Google.
-- Actionne un interrupteur ou remplie un capteur virtuel Text
-- Auteur : Aurelien Neutrino
-- Date : 29 Novembre 2015
-- Nécessite un capteur virtuel de type Text
-- Il faut suivre la source suivante et s'arrêter à la fin de l'étape 1
-- source :
-- http://easydomoticz.com/agenda-google-et-domoticz-version-2-partie-1/

-- Pour récupérer le code permettant de se connecter 
-- exécuter : sudo gcalcli --cal=Domoticz agenda '00:00' '23:59' --tsv --military
-- puis coller l'adresse dans un navigateur
-- 
---------------------------------
require "scripts/lua/functions"

commandArray = {}
--Récupère l'heure et la date actuelle
time = os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
jour = os.date('%d',time)
--Nombre de minutes depuis 00:00
maintenant=tonumber(hours*60+minutes)

--idx et nom du capteur Text
idxText = '203'
nomText="Agenda"

--nom de l'agenda google
domoticz_cal="Domoticz"

--fichier et chemin pour agenda
repertoire="/home/pi/"
file="googlecal.txt"

-- Toutes les heures, on récupère l'agenda de la journée
if(maintenant%60==0)then
   options="--tsv --military"
   agenda_start="00:00"
   agenda_end="23:59"
   
   -- Agenda Domoticz
   lignecde="sudo gcalcli --cal="..domoticz_cal.." agenda ".."'"..agenda_start.."' '"..agenda_end.."' "..options
   lignecde=lignecde.." > "..repertoire..file.." &"
   os.execute(lignecde)


   sleep(1)
   -- Agenda Standard  4/ymDKXAZQtn9azD6vFmUPQ7fJ0jJFeJWOXu___bVKD68
    lignecde="sudo gcalcli --cal=jerome.delacotte@gmail.com agenda '"..agenda_start.."' '"..agenda_end.."' "..options
   lignecde=lignecde.." >> "..repertoire..file.." &"
   os.execute(lignecde)
   
   sleep(1)
   -- Agenda Standard  4/ymDKXAZQtn9azD6vFmUPQ7fJ0jJFeJWOXu___bVKD68
    lignecde="sudo gcalcli --cal=jerome.delacotte@vif.fr agenda '"..agenda_start.."' '"..agenda_end.."' "..options
   lignecde=lignecde.." >> "..repertoire..file.." &"
   os.execute(lignecde)       
--end

  local file = io.open(repertoire..file, "r") -- Ouvre le fichier en mode lecture
  local ligne = {} -- Table pour les lignes du fichier
  
  if(file~=nil)then
  --le fichier n'est pas vide
     for line in file:lines() do -- Pour chaque lignes
        table.insert(ligne, line) -- On insère les lignes dans la table
     end
  end
   
  for i, v in ipairs(ligne) do -- Lecture de la table des RDV
     dateDebut,heureDebut,minutesDebut,dateFin,heureFin,minutesFin,action = v:match("([^;]+)\t([^;]+):([^;]+)\t([^;]+)\t([^;]+):([^;]+)\t([^;]+)")
     action = action:gsub(" = ","=")
     debutAction = heureDebut*60+minutesDebut
     finAction = heureFin*60+minutesFin
     anneeAction,moisAction,jourAction = dateDebut:match("([^;]+)-([^;]+)-([^;]+)")
     if(action~=nil and action:find("=")~=nil and jourAction == jour)then
     --L'action contient "=", c'est un interrupteur à actionner
        debug("Action : "..action)
        debug(maintenant.." : "..debutAction)
        interrupteur,etat=action:match("([^;]+)=([^;]+)")
        if(otherdevices[interrupteur]~=nil and(etat=='On' or etat=='Off' or etat=='ON' or etat=='OFF')and debutAction==maintenant)then
        --L'interrupteur existe, l'état souhaité est reconnu   
           if(etat=='On'or etat=='Off')then
              if(dateDebut~=dateFin)then
              --l'action finit demain
                 finAction=finAction+(24*60)
              end
              debug(interrupteur.." passe à "..etat.." pendant "..tostring(finAction-maintenant).." minutes")
              commandArray[interrupteur]=etat.." FOR "..tostring(finAction-maintenant)
              if(otherdevices_svalues[nomText]=='')then
              --Aucun pense-bête actuellement renseigné, on affiche l'action en cours.
              --L'affichage d'un pense-bête est prioritaire sur l'affichage d'un changement d'état
                 debug("pense-bête : "..action)
                 commandArray['UpdateDevice']=idxText.."|0|"..action
              end
           elseif(etat=='ON')then
           --ON (tout en majuscule) siginifie que l'action n'a pas de fin
              debug(interrupteur.." passe à On")
              commandArray[interrupteur]='On'   
           elseif(etat=='OFF')then
           --OFF (tout en majuscule) siginifie que l'action n'a pas de fin
              debug(interrupteur.." passe à Off")
              commandArray[interrupteur]='Off'
           else
           --Etat non reconnu, on force l'interrupteur
              debug(interrupteur.." passe à "..etat)
              commandArray[interrupteur]=etat
           end
        elseif(otherdevices[interrupteur]==nil and debutAction==maintenant)then
        --L'interrupteur n'existe pas, on affiche le pense-bête
           commandArray['UpdateDevice']=idxText.."|0|"..action
        elseif(finAction==maintenant and action == otherdevices_svalues[nomText])then
        --L'action est terminée, on l'efface
           commandArray['UpdateDevice']=idxText.."|0| "
        end
     elseif(action~=nil and action:find("Cong=")~=nil and jourAction == jour)then
        commandArray['Presence']="on"
     else
        debug("###### Action : "..action)
        if (debutAction==maintenant and jourAction == jour) then
           --L'action ne correspond pas à un interrupteur à actionner, c'est donc un pense-bête, on l'affiche pendant la durée souhaitée
           debug("####### Rappel agenda "..action)
           commandArray['UpdateDevice']=idxText.."|0|"..action
        else 
           if (finAction==maintenant and action == otherdevices_svalues[nomText]) then
              --L'action est terminée, on l'efface
              debug("####### Fin tâche agenda "..action)
              commandArray['UpdateDevice']=idxText.."|0| "
           end
        end
     end
  end
end
return commandArray