<?php

declare(strict_types=1);

namespace App\Repository;

final class TblPaisRepository
{
    private \PDO $database;

    public function __construct(\PDO $database)
    {
        $this->database = $database;
    }

    public function getDb(): \PDO
    {
        return $this->database;
    }

    public function checkAndGet(int $TblPaisId): object
    {
        $query = 'SELECT * FROM `TblPais` WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblPaisId);
        $statement->execute();
        $TblPais = $statement->fetchObject();
        if (! $TblPais) {
            throw new \Exception('TblPais not found.', 404);
        }

        return $TblPais;
    }

    public function getAll(): array
    {
        $query = 'SELECT * FROM `TblPais` ORDER BY `id`';
        $statement = $this->getDb()->prepare($query);
        $statement->execute();

        return (array) $statement->fetchAll();
    }

    public function create(object $TblPais): object
    {
        $query = 'INSERT INTO `TblPais` (`Nombre`, `TerminosYCondiciones`, `PoliticaProteccionDatos`, `TelefonoContacto`, `CorreoContacto`, `Activo`, `field1`, `field2`, `field3`, `field4`, `field5`) 
        VALUES (:Nombre, :TerminosYCondiciones, :PoliticaProteccionDatos, :TelefonoContacto, :CorreoContacto, :Activo, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblPais->id);
//         $statement->bindParam('fecha', $TblPais->fecha);
        $statement->bindParam('Nombre', $TblPais->Nombre);
        $statement->bindParam('TerminosYCondiciones', $TblPais->TerminosYCondiciones);
        $statement->bindParam('PoliticaProteccionDatos', $TblPais->PoliticaProteccionDatos);
        $statement->bindParam('TelefonoContacto', $TblPais->TelefonoContacto);
        $statement->bindParam('CorreoContacto', $TblPais->CorreoContacto);
        $statement->bindParam('Activo', $TblPais->Activo);
        $statement->bindParam('field1', $TblPais->field1);
        $statement->bindParam('field2', $TblPais->field2);
        $statement->bindParam('field3', $TblPais->field3);
        $statement->bindParam('field4', $TblPais->field4);
        $statement->bindParam('field5', $TblPais->field5);

        $statement->execute();

        return $this->checkAndGet((int) $this->getDb()->lastInsertId());
    }

    public function update(object $TblPais, object $data): object
    {
        if (isset($data->fecha)) {
            $TblPais->fecha = $data->fecha;
        }
        if (isset($data->Nombre)) {
            $TblPais->Nombre = $data->Nombre;
        }
        if (isset($data->TerminosYCondiciones)) {
            $TblPais->TerminosYCondiciones = $data->TerminosYCondiciones;
        }
        if (isset($data->PoliticaProteccionDatos)) {
            $TblPais->PoliticaProteccionDatos = $data->PoliticaProteccionDatos;
        }
        if (isset($data->TelefonoContacto)) {
            $TblPais->TelefonoContacto = $data->TelefonoContacto;
        }
        if (isset($data->CorreoContacto)) {
            $TblPais->CorreoContacto = $data->CorreoContacto;
        }
        if (isset($data->Activo)) {
            $TblPais->Activo = $data->Activo;
        }
        if (isset($data->field1)) {
            $TblPais->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblPais->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblPais->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblPais->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblPais->field5 = $data->field5;
        }

        $query = 'UPDATE `TblPais` SET `fecha` = :fecha, `Nombre` = :Nombre, `TerminosYCondiciones` = :TerminosYCondiciones, `PoliticaProteccionDatos` = :PoliticaProteccionDatos, `TelefonoContacto` = :TelefonoContacto, `CorreoContacto` = :CorreoContacto, `Activo` = :Activo, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblPais->id);
        $statement->bindParam('fecha', $TblPais->fecha);
        $statement->bindParam('Nombre', $TblPais->Nombre);
        $statement->bindParam('TerminosYCondiciones', $TblPais->TerminosYCondiciones);
        $statement->bindParam('PoliticaProteccionDatos', $TblPais->PoliticaProteccionDatos);
        $statement->bindParam('TelefonoContacto', $TblPais->TelefonoContacto);
        $statement->bindParam('CorreoContacto', $TblPais->CorreoContacto);
        $statement->bindParam('Activo', $TblPais->Activo);
        $statement->bindParam('field1', $TblPais->field1);
        $statement->bindParam('field2', $TblPais->field2);
        $statement->bindParam('field3', $TblPais->field3);
        $statement->bindParam('field4', $TblPais->field4);
        $statement->bindParam('field5', $TblPais->field5);

        $statement->execute();

        return $this->checkAndGet((int) $TblPais->id);
    }

    public function delete(int $TblPaisId): void
    {
        $query = 'DELETE FROM `TblPais` WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblPaisId);
        $statement->execute();
    }
}
