<?php

declare(strict_types=1);

namespace App\Repository;

final class TblUsuarioRepository
{
    private \PDO $database;

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

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

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

        return $TblUsuario;
    }

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

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

    public function create(object $TblUsuario): object
    {
        $query = 'INSERT INTO `TblUsuario` (`Identificacion`, `Nombres`, `Apellidos`, `CorreoElectronico`, `Contrasena`, `Departamento`, `Ciudad`, `Farmacia`, `Avatar`, `Fecha2`, `Condiciones`, 
        `TokenDispositivo`, `FechaUltimoIngreso`, `IdCiudad`, `IdDepartamento`, `IdPuntoVenta`, `IdPais`, `CalificacionGenfar`, `IdTipoUsuario`, `IdRolPanel`, `PuntoDeVentaNoPanel`, `Rol`, 
        `ActivoComunidadHigen`, `IdRepresentante`, `NombreRepresentante`, `field1`, `field2`, `field3`, `field4`, `field5`) VALUES (:Identificacion, :Nombres, :Apellidos, :CorreoElectronico, 
        :Contrasena, :Departamento, :Ciudad, :Farmacia, :Avatar, :Fecha2, :Condiciones, :TokenDispositivo, :FechaUltimoIngreso, :IdCiudad, :IdDepartamento, :IdPuntoVenta, :IdPais, :CalificacionGenfar, 
        :IdTipoUsuario, :IdRolPanel, :PuntoDeVentaNoPanel, :Rol, :ActivoComunidadHigen, :IdRepresentante, :NombreRepresentante, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblUsuario->id);
//         $statement->bindParam('fecha', $TblUsuario->fecha);
        $statement->bindParam('Identificacion', $TblUsuario->Identificacion);
        $statement->bindParam('Nombres', $TblUsuario->Nombres);
        $statement->bindParam('Apellidos', $TblUsuario->Apellidos);
        $statement->bindParam('CorreoElectronico', $TblUsuario->CorreoElectronico);
        $statement->bindParam('Contrasena', $TblUsuario->Contrasena);
        $statement->bindParam('Departamento', $TblUsuario->Departamento);
        $statement->bindParam('Ciudad', $TblUsuario->Ciudad);
        $statement->bindParam('Farmacia', $TblUsuario->Farmacia);
        $statement->bindParam('Avatar', $TblUsuario->Avatar);
        $statement->bindParam('Fecha2', $TblUsuario->Fecha2);
        $statement->bindParam('Condiciones', $TblUsuario->Condiciones);
        $statement->bindParam('TokenDispositivo', $TblUsuario->TokenDispositivo);
        $statement->bindParam('FechaUltimoIngreso', $TblUsuario->FechaUltimoIngreso);
        $statement->bindParam('IdCiudad', $TblUsuario->IdCiudad);
        $statement->bindParam('IdDepartamento', $TblUsuario->IdDepartamento);
        $statement->bindParam('IdPuntoVenta', $TblUsuario->IdPuntoVenta);
        $statement->bindParam('IdPais', $TblUsuario->IdPais);
        $statement->bindParam('CalificacionGenfar', $TblUsuario->CalificacionGenfar);
        $statement->bindParam('IdTipoUsuario', $TblUsuario->IdTipoUsuario);
        $statement->bindParam('IdRolPanel', $TblUsuario->IdRolPanel);
        $statement->bindParam('PuntoDeVentaNoPanel', $TblUsuario->PuntoDeVentaNoPanel);
        $statement->bindParam('Rol', $TblUsuario->Rol);
        $statement->bindParam('ActivoComunidadHigen', $TblUsuario->ActivoComunidadHigen);
        $statement->bindParam('IdRepresentante', $TblUsuario->IdRepresentante);
        $statement->bindParam('NombreRepresentante', $TblUsuario->NombreRepresentante);
        $statement->bindParam('field1', $TblUsuario->field1);
        $statement->bindParam('field2', $TblUsuario->field2);
        $statement->bindParam('field3', $TblUsuario->field3);
        $statement->bindParam('field4', $TblUsuario->field4);
        $statement->bindParam('field5', $TblUsuario->field5);

        $statement->execute();

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

    public function update(object $TblUsuario, object $data): object
    {
        if (isset($data->fecha)) {
            $TblUsuario->fecha = $data->fecha;
        }
        if (isset($data->Identificacion)) {
            $TblUsuario->Identificacion = $data->Identificacion;
        }
        if (isset($data->Nombres)) {
            $TblUsuario->Nombres = $data->Nombres;
        }
        if (isset($data->Apellidos)) {
            $TblUsuario->Apellidos = $data->Apellidos;
        }
        if (isset($data->CorreoElectronico)) {
            $TblUsuario->CorreoElectronico = $data->CorreoElectronico;
        }
        if (isset($data->Contrasena)) {
            $TblUsuario->Contrasena = $data->Contrasena;
        }
        if (isset($data->Departamento)) {
            $TblUsuario->Departamento = $data->Departamento;
        }
        if (isset($data->Ciudad)) {
            $TblUsuario->Ciudad = $data->Ciudad;
        }
        if (isset($data->Farmacia)) {
            $TblUsuario->Farmacia = $data->Farmacia;
        }
        if (isset($data->Avatar)) {
            $TblUsuario->Avatar = $data->Avatar;
        }
        if (isset($data->Fecha2)) {
            $TblUsuario->Fecha2 = $data->Fecha2;
        }
        if (isset($data->Condiciones)) {
            $TblUsuario->Condiciones = $data->Condiciones;
        }
        if (isset($data->TokenDispositivo)) {
            $TblUsuario->TokenDispositivo = $data->TokenDispositivo;
        }
        if (isset($data->FechaUltimoIngreso)) {
            $TblUsuario->FechaUltimoIngreso = $data->FechaUltimoIngreso;
        }
        if (isset($data->IdCiudad)) {
            $TblUsuario->IdCiudad = $data->IdCiudad;
        }
        if (isset($data->IdDepartamento)) {
            $TblUsuario->IdDepartamento = $data->IdDepartamento;
        }
        if (isset($data->IdPuntoVenta)) {
            $TblUsuario->IdPuntoVenta = $data->IdPuntoVenta;
        }
        if (isset($data->IdPais)) {
            $TblUsuario->IdPais = $data->IdPais;
        }
        if (isset($data->CalificacionGenfar)) {
            $TblUsuario->CalificacionGenfar = $data->CalificacionGenfar;
        }
        if (isset($data->IdTipoUsuario)) {
            $TblUsuario->IdTipoUsuario = $data->IdTipoUsuario;
        }
        if (isset($data->IdRolPanel)) {
            $TblUsuario->IdRolPanel = $data->IdRolPanel;
        }
        if (isset($data->PuntoDeVentaNoPanel)) {
            $TblUsuario->PuntoDeVentaNoPanel = $data->PuntoDeVentaNoPanel;
        }
        if (isset($data->Rol)) {
            $TblUsuario->Rol = $data->Rol;
        }
        if (isset($data->ActivoComunidadHigen)) {
            $TblUsuario->ActivoComunidadHigen = $data->ActivoComunidadHigen;
        }
        if (isset($data->IdRepresentante)) {
            $TblUsuario->IdRepresentante = $data->IdRepresentante;
        }
        if (isset($data->NombreRepresentante)) {
            $TblUsuario->NombreRepresentante = $data->NombreRepresentante;
        }
        if (isset($data->field1)) {
            $TblUsuario->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblUsuario->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblUsuario->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblUsuario->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblUsuario->field5 = $data->field5;
        }

        $query = 'UPDATE `TblUsuario` SET `fecha` = :fecha, `Identificacion` = :Identificacion, `Nombres` = :Nombres, `Apellidos` = :Apellidos, `CorreoElectronico` = :CorreoElectronico, `Contrasena` = :Contrasena, `Departamento` = :Departamento, `Ciudad` = :Ciudad, `Farmacia` = :Farmacia, `Avatar` = :Avatar, `Fecha2` = :Fecha2, `Condiciones` = :Condiciones, `TokenDispositivo` = :TokenDispositivo, `FechaUltimoIngreso` = :FechaUltimoIngreso, `IdCiudad` = :IdCiudad, `IdDepartamento` = :IdDepartamento, `IdPuntoVenta` = :IdPuntoVenta, `IdPais` = :IdPais, `CalificacionGenfar` = :CalificacionGenfar, `IdTipoUsuario` = :IdTipoUsuario, `IdRolPanel` = :IdRolPanel, `PuntoDeVentaNoPanel` = :PuntoDeVentaNoPanel, `Rol` = :Rol, `ActivoComunidadHigen` = :ActivoComunidadHigen, `IdRepresentante` = :IdRepresentante, `NombreRepresentante` = :NombreRepresentante, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblUsuario->id);
        $statement->bindParam('fecha', $TblUsuario->fecha);
        $statement->bindParam('Identificacion', $TblUsuario->Identificacion);
        $statement->bindParam('Nombres', $TblUsuario->Nombres);
        $statement->bindParam('Apellidos', $TblUsuario->Apellidos);
        $statement->bindParam('CorreoElectronico', $TblUsuario->CorreoElectronico);
        $statement->bindParam('Contrasena', $TblUsuario->Contrasena);
        $statement->bindParam('Departamento', $TblUsuario->Departamento);
        $statement->bindParam('Ciudad', $TblUsuario->Ciudad);
        $statement->bindParam('Farmacia', $TblUsuario->Farmacia);
        $statement->bindParam('Avatar', $TblUsuario->Avatar);
        $statement->bindParam('Fecha2', $TblUsuario->Fecha2);
        $statement->bindParam('Condiciones', $TblUsuario->Condiciones);
        $statement->bindParam('TokenDispositivo', $TblUsuario->TokenDispositivo);
        $statement->bindParam('FechaUltimoIngreso', $TblUsuario->FechaUltimoIngreso);
        $statement->bindParam('IdCiudad', $TblUsuario->IdCiudad);
        $statement->bindParam('IdDepartamento', $TblUsuario->IdDepartamento);
        $statement->bindParam('IdPuntoVenta', $TblUsuario->IdPuntoVenta);
        $statement->bindParam('IdPais', $TblUsuario->IdPais);
        $statement->bindParam('CalificacionGenfar', $TblUsuario->CalificacionGenfar);
        $statement->bindParam('IdTipoUsuario', $TblUsuario->IdTipoUsuario);
        $statement->bindParam('IdRolPanel', $TblUsuario->IdRolPanel);
        $statement->bindParam('PuntoDeVentaNoPanel', $TblUsuario->PuntoDeVentaNoPanel);
        $statement->bindParam('Rol', $TblUsuario->Rol);
        $statement->bindParam('ActivoComunidadHigen', $TblUsuario->ActivoComunidadHigen);
        $statement->bindParam('IdRepresentante', $TblUsuario->IdRepresentante);
        $statement->bindParam('NombreRepresentante', $TblUsuario->NombreRepresentante);
        $statement->bindParam('field1', $TblUsuario->field1);
        $statement->bindParam('field2', $TblUsuario->field2);
        $statement->bindParam('field3', $TblUsuario->field3);
        $statement->bindParam('field4', $TblUsuario->field4);
        $statement->bindParam('field5', $TblUsuario->field5);

        $statement->execute();

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

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