<?php

class PV_Visu extends IPSModule
{
    public function Create()
    {
        parent::Create();

        $this->RegisterPropertyInteger('VarProduction', 0);
        $this->RegisterPropertyInteger('VarConsumption', 0);
        $this->RegisterPropertyInteger('VarFeedIn', 0);
        $this->RegisterPropertyInteger('VarGrid', 0);

        $this->RegisterVariableString('JSONData', 'Visualisierungsdaten', '', 0);
        IPS_SetHidden($this->GetIDForIdent('JSONData'), true);

        $this->SetVisualizationType(1); // HTML SDK Tile
    }

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

        foreach (['VarProduction', 'VarConsumption', 'VarFeedIn', 'VarGrid'] as $prop) {
            $vid = $this->ReadPropertyInteger($prop);
            if ($vid > 0) {
                $this->RegisterMessage($vid, VM_UPDATE);
            }
        }

        $this->UpdateData(); // Initial
    }

    public function MessageSink($TimeStamp, $SenderID, $Message, $Data)
    {
        if ($Message === VM_UPDATE) {
            $this->UpdateData();
        }
    }

    public function GetVisualizationTile()
    {
        $initialData = '<script>handleMessage(' . json_encode($this->UpdateData()) . ');</script>';
        $html = file_get_contents(__DIR__ . '/module.html');
        return $html . $initialData;
    }

    public function RequestAction($Ident, $Value)
    {
        if ($Ident === 'update') {
            return $this->UpdateData(); // Rückgabe für Visualisierung
        }
        throw new \Exception("Unknown Ident: $Ident");
    }

    public function UpdateData()
    {
        $start = strtotime('today 00:00');
        $end   = time();

        $prod = $this->GetDailyTotal($this->ReadPropertyInteger('VarProduction'), $start, $end);
        $cons = $this->GetDailyTotal($this->ReadPropertyInteger('VarConsumption'), $start, $end);
        $feed = $this->GetDailyTotal($this->ReadPropertyInteger('VarFeedIn'), $start, $end);
        $grid = $this->GetDailyTotal($this->ReadPropertyInteger('VarGrid'), $start, $end);

        $prodCons = $prod > 0 ? (($cons - $grid) / $prod) * 100 : 0;
        $prodFeed = $prod > 0 ? 100 - $prodCons : 0;
        $consPV   = $cons > 0 ? min($prod, ($cons - $grid)) / $cons * 100 : 0;
        $consGrid = $cons > 0 ? 100 - $consPV : 0;

        $data = [
            'prodCons' => round($prodCons, 1),
            'prodFeed' => round($prodFeed, 1),
            'consPV'   => round($consPV,   1),
            'consGrid' => round($consGrid, 1),
            'value'    => [
                'prod' => round($prod, 2),
                'cons' => round($cons, 2),
                'feed' => round($feed, 2),
                'grid' => round($grid, 2),
            ],
        ];

        $json = json_encode($data);
        SetValueString($this->GetIDForIdent('JSONData'), $json);
        return $data;
    }

    private function GetDailyTotal(int $varID, int $start, int $end)
    {
        if ($varID <= 0) return 0.0;

        $archiveID = @IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];
        if (!$archiveID) return 0.0;

        $values = @AC_GetAggregatedValues($archiveID, $varID, 1, $start, $end, 1);
        return isset($values[0]['Avg']) ? (float)$values[0]['Avg'] : 0.0;
    }
}