<?php
declare(strict_types=1);

include_once __DIR__ . '/libs/vendor/autoload.php'; // TCPDF via Composer

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

        // Eigenschaften
        $this->RegisterPropertyString('Users', '[]');
        $this->RegisterPropertyString('PowerMeters', '[]');
        $this->RegisterPropertyString('WaterMeters', '[]');
        $this->RegisterPropertyString('Tariffs', '[]');

        // Variablen
        $this->RegisterVariableInteger('FromDate', 'Startdatum', '~UnixTimestamp', 1);
        $this->RegisterVariableInteger('ToDate', 'Enddatum', '~UnixTimestamp', 2);
        $this->RegisterVariableString('LastResult', 'Letzte Abrechnung', '', 3);
        $this->EnableAction('FromDate');
        $this->EnableAction('ToDate');

        // Abrechnungs-Button
        $this->RegisterScript('StartBilling', 'Abrechnung starten', "<?php IPS_RequestAction(" . $this->InstanceID . ", 'StartBilling', ''); ?>");

        // 🧾 Media-Objekt für PDF-Ergebnis
        $this->RegisterMediaDocument('InvoicePDF', 'Letzte Rechnung', 'pdf');
    }

    public function ApplyChanges()
    {
        parent::ApplyChanges();
        IPS_LogMessage('Abrechnung', 'Modul geladen');
    }

    private function RegisterMediaDocument($Ident, $Name, $Extension, $Position = 0)
    {
        $mid = @IPS_GetObjectIDByIdent($Ident, $this->InstanceID);
        if ($mid === false) {
            $mid = IPS_CreateMedia(5); // 5 = Document
            IPS_SetParent($mid, $this->InstanceID);
            IPS_SetIdent($mid, $Ident);
            IPS_SetName($mid, $Name);
            IPS_SetPosition($mid, $Position);
            IPS_SetMediaFile($mid, 'media/' . $mid . '.' . $Extension, false);
            IPS_LogMessage('Abrechnung', 'Media-Datei erstellt: media/' . $mid . '.' . $Extension);
        }
    }

public function RequestAction($Ident, $Value)
{
    IPS_LogMessage('Abrechnung', "RequestAction: $Ident");

    switch ($Ident) {
        case 'FromDate':
        case 'ToDate':
            SetValue($this->GetIDForIdent($Ident), $Value);
            break;

        case 'StartBilling':
            IPS_LogMessage('Abrechnung', 'Starte Abrechnung...');
            try {
                $pdfContent = $this->GenerateInvoices();
                if ($pdfContent === false) {
                    IPS_LogMessage('Abrechnung', '❌ GenerateInvoices() lieferte false zurück');
                    echo "❌ Fehler bei der PDF-Erstellung (GenerateInvoices)";
                    return;
                }
                if ($pdfContent === null) {
                    IPS_LogMessage('Abrechnung', '❌ GenerateInvoices() gab null zurück');
                    echo "❌ Fehler bei der PDF-Erstellung (leer)";
                    return;
                }
                if (strlen($pdfContent) < 100) {
                    IPS_LogMessage('Abrechnung', '❌ PDF-Inhalt zu kurz: ' . strlen($pdfContent));
                    echo "❌ Fehler bei der PDF-Erstellung (leeres PDF)";
                    return;
                }

                $mediaID = $this->GetIDForIdent('InvoicePDF');
                if (!$mediaID) {
                    IPS_LogMessage('Abrechnung', '❌ Media-ID nicht gefunden');
                    echo "❌ Kein Media-Objekt vorhanden";
                    return;
                }

                IPS_SetMediaContent($mediaID, base64_encode($pdfContent));
                SetValue($this->GetIDForIdent('LastResult'), 'Abrechnung vom ' . date('d.m.Y H:i'));
                IPS_LogMessage('Abrechnung', '✅ Abrechnung erfolgreich gespeichert (' . strlen($pdfContent) . ' Bytes)');
                echo "✅ PDF erfolgreich erstellt.";

            } catch (Throwable $e) {
                IPS_LogMessage('Abrechnung', '💥 Exception in StartBilling: ' . $e->getMessage());
                echo "❌ Ausnahmefehler: " . $e->getMessage();
            }
            break;
    }
}


    // ====================== PDF-Logik ======================

public function GenerateInvoices()
{
    $from = GetValue($this->GetIDForIdent('FromDate'));
    $to   = GetValue($this->GetIDForIdent('ToDate'));

    IPS_LogMessage('Abrechnung', '🕒 Starte GenerateInvoices()');
    IPS_LogMessage('Abrechnung', 'Zeitraum von ' . date('d.m.Y H:i', $from) . ' bis ' . date('d.m.Y H:i', $to));

    $users   = json_decode($this->ReadPropertyString('Users'), true);
    $power   = json_decode($this->ReadPropertyString('PowerMeters'), true);
    $water   = json_decode($this->ReadPropertyString('WaterMeters'), true);
    $tariffs = json_decode($this->ReadPropertyString('Tariffs'), true);

    if (!class_exists('TCPDF')) {
        IPS_LogMessage('Abrechnung', '❌ TCPDF fehlt – prüfe libs/vendor/autoload.php');
        return false;
    }

    try {
        $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
        $pdf->SetCreator('IPSymcon Abrechnung');
        $pdf->SetMargins(15, 15, 15);
        $pdf->SetAutoPageBreak(true, 20);
        $pdf->SetFont('dejavusans', '', 10);

    foreach ($users as $user) {
        IPS_LogMessage('Abrechnung', '→ Erstelle Seite für Benutzer: ' . $user['name']);
        $pdf->AddPage();

        // 🔽 Hier fügst du den neuen HTML-Block ein:
        $html = "
        <h2>Rechnung für {$user['name']}</h2>
        <p>{$user['address']}<br>{$user['city']}</p>
        <table border='1' cellpadding='2' style='font-size:8px;'>
        <tr style='background-color:#e0e0e0;'>
            <th>Zähler</th>
            <th>Typ</th>
            <th>Startzeit</th>
            <th>Endzeit</th>
            <th>Zählerstand Start</th>
            <th>Zählerstand Ende</th>
            <th>Verbrauch</th>
            <th>Tarif (Rp)</th>
            <th>Kosten (CHF)</th>
        </tr>
        ";

        $total = 0.0;
        foreach ($power as $m) {
            if ($m['user_id'] != $user['id']) continue;
            $cost = $this->AddMeterToPDFRow($m, $tariffs, $from, $to, 'Strombezug');
            $html .= $cost['row'];
            $total += $cost['value'];
        }
        foreach ($water as $m) {
            if ($m['user_id'] != $user['id']) continue;
