<?php
require_once 'php-enum/src/Enum.php';
//require_once 'php-mqtt-client/src/Exceptions/DataTransferException.php';
require_once 'php-mqtt-client/src/MessageType.php';
require_once 'php-mqtt-client/src/Message.php';
require_once 'php-mqtt-client/src/PendingMessage.php';
require_once 'php-mqtt-client/src/SubscribeRequest.php';
require_once 'php-mqtt-client/src/Subscription.php';
require_once 'log-master/src/LogLevel.php';
require_once 'php-mqtt-client/src/Contracts/MessageProcessor.php';
require_once 'php-mqtt-client/src/Concerns/WorksWithBuffers.php';
require_once 'php-mqtt-client/src/Concerns/TranscodesData.php';
require_once 'php-mqtt-client/src/MessageProcessors/BaseMessageProcessor.php';
require_once 'php-mqtt-client/src/MessageProcessors/Mqtt31MessageProcessor.php';
require_once 'log-master/src/LoggerInterface.php';
require_once 'php-mqtt-client/src/Logger.php';
require_once 'php-mqtt-client/src/Contracts/Repository.php';
require_once 'php-mqtt-client/src/Repositories/MemoryRepository.php';
require_once 'php-mqtt-client/src/Contracts/MqttClient.php';
require_once 'php-mqtt-client/src/Concerns/ValidatesConfiguration.php';
require_once 'php-mqtt-client/src/Concerns/OffersHooks.php';
require_once 'php-mqtt-client/src/Concerns/GeneratesRandomClientIds.php';
require_once 'php-mqtt-client/src/MqttClient.php';
require_once 'php-mqtt-client/src/ConnectionSettings.php';
// Otros archivos necesarios según tu uso...
date_default_timezone_set("America/La_Paz");

include "core/autoload.php";
include "core/app/model/MqttData.php";

use PhpMqtt\Client\MqttClient;
use PhpMqtt\Client\ConnectionSettings;

$server = '192.168.0.201';
$port = 1893;
$clientId = 'php-mqtt-client';

$dbHost = 'localhost';
$dbName = 'forza_mqtt';
$dbUser = 'root';
$dbPass = 'Tykun.2026';

try {
    // Conexión a la base de datos MySQL
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "Conexión a la base de datos establecida...\n";
} catch (PDOException $e) {
    die("Error al conectar a la base de datos: " . $e->getMessage());
}

$mqtt = new MqttClient($server, $port, $clientId);

$connectionSettings = (new ConnectionSettings())
    ->setUsername('admin')
    ->setPassword('Monitoreo.2022')
    ->setKeepAliveInterval(60);

echo "Conectando al broker MQTT...\n";

try {
    $mqtt->connect($connectionSettings, true);

    $mqtt->subscribe('ups', function (string $topic, string $message) use ($pdo) {
        echo "Mensaje recibido en [$topic]: $message\n";

        // Guardar el mensaje en un archivo JSON
        $dataFile = __DIR__ . '/data/data.json';
        $data = [];

        // Leer los datos existentes
        if (file_exists($dataFile)) {
            $data = json_decode(file_get_contents($dataFile), true) ?? [];
        }

        // Decodificar el mensaje recibido y agregarlo al archivo JSON
        $decodedMessage = json_decode($message, true);
        $data[] = $decodedMessage;

        // Guardar los datos actualizados en el archivo JSON
        file_put_contents($dataFile, json_encode($data, JSON_PRETTY_PRINT));

        // Insertar el mensaje en la base de datos MySQL
        $stmt = $pdo->prepare("
                INSERT INTO ups_data (
                    input_voltage,
                    out_voltage,
                    battery_temperature,
                    battery_voltage,
                    in_frequency,
                    out_frequency,
                    ratout_apparent_power,
                    battery_estimate_minutes_remaining,
                    id_ups_type,
                    output_current,
                    out_percent_load,
                    battery_number_in_series,
                    bating_estimate_charge_remaining,
                    ratout_battery_voltage
                ) VALUES (
                    :input_voltage,
                    :out_voltage,
                    :battery_temperature,
                    :battery_voltage,
                    :in_frequency,
                    :out_frequency,
                    :ratout_apparent_power,
                    :battery_estimate_minutes_remaining,
                    :id_ups_type,
                    :output_current,
                    :out_percent_load,
                    :battery_number_in_series,
                    :bating_estimate_charge_remaining,
                    :ratout_battery_voltage
                )
            ");

        $stmt->execute([
            ':input_voltage' => $decodedMessage['Input Voltage*'] ?? null,
            ':out_voltage' => $decodedMessage['Out Voltage*'] ?? null,
            ':battery_temperature' => $decodedMessage['Battery Temperature*'] ?? null,
            ':battery_voltage' => $decodedMessage['Battery Voltage*'] ?? null,
            ':in_frequency' => $decodedMessage['In Frequency*'] ?? null,
            ':out_frequency' => $decodedMessage['Out Frequency*'] ?? null,
            ':ratout_apparent_power' => $decodedMessage['Ratout Apparent Power*'] ?? null,
            ':battery_estimate_minutes_remaining' => $decodedMessage['Battery Estimate Minutes Remaining'] ?? null,
            ':id_ups_type' => $decodedMessage['Id UPS Type'] ?? null,
            ':output_current' => $decodedMessage['Output Current*'] ?? null,
            ':out_percent_load' => $decodedMessage['Out Precent Load'] ?? null,
            ':battery_number_in_series' => $decodedMessage['Battery Number In Series'] ?? null,
            ':bating_estimate_charge_remaining' => $decodedMessage['Bating Estimate Charge Remaining'] ?? null,
            ':ratout_battery_voltage' => $decodedMessage['Ratout Battery Voltage*'] ?? null,
        ]);
        $user = new MqttData();
        $user->addExtraFieldString("input_voltage", htmlentities($decodedMessage['Input Voltage*']));
        $user->addExtraFieldString("out_voltage", htmlentities($decodedMessage['Out Voltage*']));
        $user->addExtraFieldString("battery_temperature", htmlentities($decodedMessage['Battery Temperature*']));
        $user->addExtraFieldString("battery_voltage", htmlentities($decodedMessage['Battery Voltage*']));
        $user->addExtraFieldString("in_frequency", htmlentities($decodedMessage['In Frequency*']));
        $user->addExtraFieldString("out_frequency", htmlentities($decodedMessage['Out Frequency*']));
        $user->addExtraFieldString("ratout_apparent_power", htmlentities($decodedMessage['Ratout Apparent Power*']));
        $user->addExtraFieldString("battery_estimate_minutes_remaining", htmlentities($decodedMessage['Battery Estimate Minutes Remaining']));
        $user->addExtraFieldString("id_ups_type", htmlentities($decodedMessage['Id UPS Type']));
        $user->addExtraFieldString("output_current", htmlentities($decodedMessage['Output Current*']));
        $user->addExtraFieldString("out_percent_load", htmlentities($decodedMessage['Out Precent Load']));
        $user->addExtraFieldString("battery_number_in_series", htmlentities($decodedMessage['Battery Number In Series']));
        $user->addExtraFieldString("bating_estimate_charge_remaining", htmlentities($decodedMessage['Bating Estimate Charge Remaining']));
        $user->addExtraFieldString("ratout_battery_voltage", htmlentities($decodedMessage['Ratout Battery Voltage*']));
        $datetime = new DateTime("now", new DateTimeZone("America/La_Paz")); // Reemplaza con tu zona horaria
        $formattedDatetime = $datetime->format('Y-m-d H:i:s');
        $user->addExtraFieldString("created_at", $formattedDatetime); // Guardar la fecha ajustada
        $user->add();

        echo "Datos insertados en la base de datos.\n";
    }, 0);

    // Mantener el cliente en ejecución
    $mqtt->loop(true);

    $mqtt->disconnect();
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}
// $server = '192.168.0.201';
// $port = 1893;
// $clientId = 'php-mqtt-client';

// $mqtt = new MqttClient($server, $port, $clientId);

// $connectionSettings = (new ConnectionSettings())
//    ->setUsername('admin')
//    ->setPassword('Monitoreo.2022')
//    ->setKeepAliveInterval(60);

// try {
//    set_time_limit(30); // Limitar la ejecución del script

//    echo "Conectando al broker MQTT...\n";
//    $mqtt->connect($connectionSettings, true);

//    // Crear archivo para almacenar los datos
//    $dataFile = 'data/data.json';

//    $mqtt->subscribe('ups', function (string $topic, string $message) use ($dataFile) {
//       echo "Mensaje recibido en [$topic]: $message\n";

//       // Guardar el mensaje en un archivo JSON
//       $data = json_decode($message, true); // Decodificar el mensaje
//       if ($data) {
//          $existingData = file_exists($dataFile) ? json_decode(file_get_contents($dataFile), true) : [];
//          $existingData[] = $data;
//          file_put_contents($dataFile, json_encode($existingData));
//       }
//    }, 0);

//    // Bucle controlado
//    $startTime = time();
//    $maxDuration = 20;

//    while (true) {
//       $mqtt->loop(false);

//       if (time() - $startTime >= $maxDuration) {
//          break;
//       }

//       usleep(100000);
//    }
// } catch (Exception $e) {
//    echo "Error: " . $e->getMessage() . "\n";
// } finally {
//    if ($mqtt->isConnected()) {
//       $mqtt->disconnect();
//       echo "Conexión cerrada.\n";
//    }
// }
