<?php

declare(strict_types=1);

namespace App\Repository;

final class TblReporteRepository
{
    private \PDO $database;

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

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

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

        return $TblReporte;
    }

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

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

    public function create(object $TblReporte): object
    {
        $query = 'INSERT INTO `TblReporte` (`Nombre`, `Descripcion`, `IdTipo`, `Consulta`, `FiltroFecha`, `IdUsuarioActualiza`, `FechaActualizacion`, `Consultafiltrofecha`, `IdPais`, `ColumnasFiltro`, 
        `ConsultaFiltroOpcional`, `CadenaOpcionesFiltro`, `field1`, `field2`, `field3`, `field4`, `field5`) VALUES (:Nombre, :Descripcion, :IdTipo, :Consulta, :FiltroFecha, :IdUsuarioActualiza, 
        :FechaActualizacion, :Consultafiltrofecha, :IdPais, :ColumnasFiltro, :ConsultaFiltroOpcional, :CadenaOpcionesFiltro, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblReporte->id);
//         $statement->bindParam('fecha', $TblReporte->fecha);
        $statement->bindParam('Nombre', $TblReporte->Nombre);
        $statement->bindParam('Descripcion', $TblReporte->Descripcion);
        $statement->bindParam('IdTipo', $TblReporte->IdTipo);
        $statement->bindParam('Consulta', $TblReporte->Consulta);
        $statement->bindParam('FiltroFecha', $TblReporte->FiltroFecha);
        $statement->bindParam('IdUsuarioActualiza', $TblReporte->IdUsuarioActualiza);
        $statement->bindParam('FechaActualizacion', $TblReporte->FechaActualizacion);
        $statement->bindParam('Consultafiltrofecha', $TblReporte->Consultafiltrofecha);
        $statement->bindParam('IdPais', $TblReporte->IdPais);
        $statement->bindParam('ColumnasFiltro', $TblReporte->ColumnasFiltro);
        $statement->bindParam('ConsultaFiltroOpcional', $TblReporte->ConsultaFiltroOpcional);
        $statement->bindParam('CadenaOpcionesFiltro', $TblReporte->CadenaOpcionesFiltro);
        $statement->bindParam('field1', $TblReporte->field1);
        $statement->bindParam('field2', $TblReporte->field2);
        $statement->bindParam('field3', $TblReporte->field3);
        $statement->bindParam('field4', $TblReporte->field4);
        $statement->bindParam('field5', $TblReporte->field5);

        $statement->execute();

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

    public function update(object $TblReporte, object $data): object
    {
        if (isset($data->fecha)) {
            $TblReporte->fecha = $data->fecha;
        }
        if (isset($data->Nombre)) {
            $TblReporte->Nombre = $data->Nombre;
        }
        if (isset($data->Descripcion)) {
            $TblReporte->Descripcion = $data->Descripcion;
        }
        if (isset($data->IdTipo)) {
            $TblReporte->IdTipo = $data->IdTipo;
        }
        if (isset($data->Consulta)) {
            $TblReporte->Consulta = $data->Consulta;
        }
        if (isset($data->FiltroFecha)) {
            $TblReporte->FiltroFecha = $data->FiltroFecha;
        }
        if (isset($data->IdUsuarioActualiza)) {
            $TblReporte->IdUsuarioActualiza = $data->IdUsuarioActualiza;
        }
        if (isset($data->FechaActualizacion)) {
            $TblReporte->FechaActualizacion = $data->FechaActualizacion;
        }
        if (isset($data->Consultafiltrofecha)) {
            $TblReporte->Consultafiltrofecha = $data->Consultafiltrofecha;
        }
        if (isset($data->IdPais)) {
            $TblReporte->IdPais = $data->IdPais;
        }
        if (isset($data->ColumnasFiltro)) {
            $TblReporte->ColumnasFiltro = $data->ColumnasFiltro;
        }
        if (isset($data->ConsultaFiltroOpcional)) {
            $TblReporte->ConsultaFiltroOpcional = $data->ConsultaFiltroOpcional;
        }
        if (isset($data->CadenaOpcionesFiltro)) {
            $TblReporte->CadenaOpcionesFiltro = $data->CadenaOpcionesFiltro;
        }
        if (isset($data->field1)) {
            $TblReporte->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblReporte->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblReporte->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblReporte->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblReporte->field5 = $data->field5;
        }

        $query = 'UPDATE `TblReporte` SET `fecha` = :fecha, `Nombre` = :Nombre, `Descripcion` = :Descripcion, `IdTipo` = :IdTipo, `Consulta` = :Consulta, `FiltroFecha` = :FiltroFecha, `IdUsuarioActualiza` = :IdUsuarioActualiza, `FechaActualizacion` = :FechaActualizacion, `Consultafiltrofecha` = :Consultafiltrofecha, `IdPais` = :IdPais, `ColumnasFiltro` = :ColumnasFiltro, `ConsultaFiltroOpcional` = :ConsultaFiltroOpcional, `CadenaOpcionesFiltro` = :CadenaOpcionesFiltro, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblReporte->id);
        $statement->bindParam('fecha', $TblReporte->fecha);
        $statement->bindParam('Nombre', $TblReporte->Nombre);
        $statement->bindParam('Descripcion', $TblReporte->Descripcion);
        $statement->bindParam('IdTipo', $TblReporte->IdTipo);
        $statement->bindParam('Consulta', $TblReporte->Consulta);
        $statement->bindParam('FiltroFecha', $TblReporte->FiltroFecha);
        $statement->bindParam('IdUsuarioActualiza', $TblReporte->IdUsuarioActualiza);
        $statement->bindParam('FechaActualizacion', $TblReporte->FechaActualizacion);
        $statement->bindParam('Consultafiltrofecha', $TblReporte->Consultafiltrofecha);
        $statement->bindParam('IdPais', $TblReporte->IdPais);
        $statement->bindParam('ColumnasFiltro', $TblReporte->ColumnasFiltro);
        $statement->bindParam('ConsultaFiltroOpcional', $TblReporte->ConsultaFiltroOpcional);
        $statement->bindParam('CadenaOpcionesFiltro', $TblReporte->CadenaOpcionesFiltro);
        $statement->bindParam('field1', $TblReporte->field1);
        $statement->bindParam('field2', $TblReporte->field2);
        $statement->bindParam('field3', $TblReporte->field3);
        $statement->bindParam('field4', $TblReporte->field4);
        $statement->bindParam('field5', $TblReporte->field5);

        $statement->execute();

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

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