<?php

class Belevo_Server_Kommunikation extends IPSModule
{
    public function Create()
    {
        // Die Standard-Create() Methode aufrufen
        parent::Create();

        // Registrierung der Eigenschaften
        $this->RegisterPropertyString(
            "BaseURL",
            "https://brain.belevo.ch/storedata"
        );
        $this->RegisterPropertyString("Anlagenummer", "0");
        $this->RegisterPropertyBoolean("InfluxJaNein", false);

        // JSON-String für Zusatzvariablen
        $this->RegisterPropertyString("ZusatzVariablen", json_encode([])); // Bezeichnung der Liste
        $this->RegisterPropertyString("Variable", "0"); // Datenpunkt kann im Syncom ausgewählt werden
        $this->RegisterPropertyString("Variablenname", "0"); // Name für Influxaufzeichnung
        $this->RegisterPropertyString("Gerätenummer", "0");
        $this->RegisterPropertyString("Ortschaft", "0");

        $this->RegisterVariableInteger(
            "Wolkenwarscheinlichkeit",
            "Wolkenwarscheinlichkeit"
        );
        $this->RegisterVariableInteger("Temperatur", "Temperatur");

        // Timer registrieren
        $this->RegisterTimer(
            "Timer_Influx",
            0,
            "IPS_RequestAction(" . $this->InstanceID . ', "GetAction", "");'
        );
    }

    public function ApplyChanges()
    {
        parent::ApplyChanges();

        // Holen Sie sich die Einstellung, ob Influx aktiviert ist
        $InfluxJaNein = $this->ReadPropertyBoolean("InfluxJaNein");

        if ($InfluxJaNein) {
            // Timer auf 5 Minuten setzen
            $this->SetTimerInterval("Timer_Influx", 300000); // Alle 5 Minuten -> 5*60*1000=300000
        } else {
            // Timer stoppen
            $this->SetTimerInterval("Timer_Influx", 0);
        }
    }

    public function getWetter($bn, $pw, $loc)
    {
        // URL mit Parametern zusammenstellen
        $url =
            "https://brain.belevo.ch/v2wetter?loc=" .
            urlencode($loc) .
            "&nr=" .
            urlencode($bn);

        // HTTP-Anfrage-Header einstellen
        $headers = ["id: $pw"];

        // cURL-Initialisierung
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        // HTTP-Anfrage ausführen und Antwort erhalten
        $response = curl_exec($ch);
        curl_close($ch);

        // Antwort in ein Array dekodieren
        $data = json_decode($response, true);

        // Überprüfen, ob die benötigten Felder vorhanden sind und zurückgeben
        if (
            isset($data["forecast"]["forecastday"][0]["hour"][5]["temp_c"]) &&
            isset($data["forecast"]["forecastday"][0]["hour"][8]["cloud"])
        ) {
            return [
                "temp" =>
                    $data["forecast"]["forecastday"][0]["hour"][5]["temp_c"],
                "cloud" =>
                    $data["forecast"]["forecastday"][0]["hour"][8]["cloud"],
            ];
        }

        // Fehlerbehandlung
        return null;
    }

    private function ProcessZusatzVariablen()
    {
        // Abrufen der ZusatzVariablen-Liste
        $zusatzVariablen = json_decode(
            $this->ReadPropertyString("ZusatzVariablen"),
            true
        ); // JSON decodieren

        // Array für die Ausgabe erstellen
        $output = [];

        // Verarbeitung der Variablen
        if (!empty($zusatzVariablen)) {
            foreach ($zusatzVariablen as $variable) {
                // Überprüfen, ob der Variablenname gesetzt ist
                if (isset($variable["Variablenname"])) {
                    $variablenname = $variable["Variablenname"];
                } else {
                    IPS_LogMessage(
                        "Belevo_Server_Kommunikation",
                        "Variablenname nicht gesetzt für die Variable: " .
                            json_encode($variable)
                    );
                    continue; // Mit der nächsten Variable fortfahren
                }

                $variableID = $variable["Variable"];

                // Überprüfen, ob die Variable existiert
                if (IPS_VariableExists($variableID)) {
                    $wert = GetValue($variableID); // Den aktuellen Wert der Zusatzvariable abrufen

                    // Wert dem Variablenname zuweisen
                    $output[$variablenname] = $wert;
                } else {
                    IPS_LogMessage(
                        "Belevo_Server_Kommunikation",
                        "Variable mit ID $variableID existiert nicht."
                    );
                }
            }
        }

        // Wenn gewünscht, kannst du das JSON zurückgeben oder speichern
        return json_encode($output);
    }

    public function RequestAction($Ident, $Value)
    {
        switch ($Ident) {
            case "GetAction":
                $this->GetAction();
                break;
            default:
                throw new Exception("Invalid action");
        }
    }

    public function GetAction()
    {
        $output = $this->ProcessZusatzVariablen();
        $json = $this->MakeJson($output);
        // Verarbeite die Zusatzvariablen

        $baseURL = $this->ReadPropertyString("BaseURL");

        $anlagenummer = $this->ReadPropertyString("Anlagenummer");

        $answer = $this->getWetter(
            $anlagenummer,
            $this->ReadPropertyString("Gerätenummer"),
            $this->ReadPropertyString("Ortschaft")
        );

        //$this->SetValue("Temperatur", $answer['temp']);
        //$this->SetValue("Wolkenwarscheinlichkeit", $answer['cloud']);
        if (isset($answer["temp"])) {
            $this->SetValue("Temperatur", $answer["temp"]);
        } else {
            IPS_LogMessage(
                "Belevo_Server_Kommunikation",
                "Temperatur-Wert ist nicht vorhanden."
            );
        }

        if (isset($answer["cloud"])) {
            $this->SetValue("Wolkenwarscheinlichkeit", $answer["cloud"]);
        } else {
            IPS_LogMessage(
                "Belevo_Server_Kommunikation",
                "Wolkenwarscheinlichkeit-Wert ist nicht vorhanden."
            );
        }

        if (!empty($json)) {
            // Kombiniere die URL mit der Anlagenummer
            $fullURL = $baseURL;
            $this->SendJsonToInfluxDB($fullURL, $json);
        } else {
            IPS_LogMessage(
                "Belevo_Server_Kommunikation",
                "Keine Aufzeichnung im Influx: Anlagenummer oder JSON-Daten fehlen"
            );
        }
    }

    public function MakeJson($json)
    {
        $an_nummer = $this->ReadPropertyString("Anlagenummer"); // Anlagenummer lesen
        $InfluxJaNein = $this->ReadPropertyBoolean("InfluxJaNein");

        // Werte in ein Array packen
        $influxData = [
            "Value" => [
                "InfluxAllowed" => $InfluxJaNein, // Setze InfluxAllowed
            ],
            "Parameter" => [
                "Influxadr" => $an_nummer,
            ],
            "Tracker" => $json, // Initialisiere Tracker als leeres Array
        ];

        // Array in JSON konvertieren
        $json = json_encode($influxData);

        // JSON zurückgeben oder weiterverarbeiten
        return $json;
    }

    private function SendJsonToInfluxDB($url, $jsonData)
    {
        $pw = $this->ReadPropertyString("Gerätenummer");
        if (empty($pw)) {
            IPS_LogMessage(
                "Belevo_Server_Kommunikation",
                "Fehler: Gerätenummer ist leer."
            );
            return;
        }

        // cURL Initialisieren
        $curl = curl_init();
        // Optionen für cURL-Request definieren
        curl_setopt_array($curl, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true, // POST-Methode verwenden
            CURLOPT_HTTPHEADER => [
                "Content-Type: application/json", // Header für JSON-Daten setzen
                "Accept: application/json",
                "id:" . $pw,
            ],
            CURLOPT_POSTFIELDS => $jsonData, // JSON-Daten als POST-Feld senden
        ]);

        // cURL-Request ausführen
        $result = curl_exec($curl);

        $error = curl_error($curl);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        // cURL beenden
        curl_close($curl);

        if ($error) {
            IPS_LogMessage(
                "Belevo_Server_Kommunikation",
                "Fehler beim Senden an Influx: " . $error
            );
        }
    }
}

?>
