<?php

declare(strict_types=1);

namespace App\Repository;

final class TblPuntoVentaRepository
{
    private \PDO $database;

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

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

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

        return $TblPuntoVenta;
    }

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

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

    public function create(object $TblPuntoVenta): object
    {
        $query = 'INSERT INTO `TblPuntoVenta` (`Codigo`, `Nombre`, `IdCanal`, `Direccion`, `IdDepartamento`, `IdCiudad`, `IdSupervisor`, `IdRepresentante`, `Activo`, `IdPais`, `field1`, `field2`, `field3`, 
        `field4`, `field5`) VALUES (:Codigo, :Nombre, :IdCanal, :Direccion, :IdDepartamento, :IdCiudad, :IdSupervisor, :IdRepresentante, :Activo, :IdPais, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblPuntoVenta->id);
//         $statement->bindParam('fecha', $TblPuntoVenta->fecha);
        $statement->bindParam('Codigo', $TblPuntoVenta->Codigo);
        $statement->bindParam('Nombre', $TblPuntoVenta->Nombre);
        $statement->bindParam('IdCanal', $TblPuntoVenta->IdCanal);
        $statement->bindParam('Direccion', $TblPuntoVenta->Direccion);
        $statement->bindParam('IdDepartamento', $TblPuntoVenta->IdDepartamento);
        $statement->bindParam('IdCiudad', $TblPuntoVenta->IdCiudad);
        $statement->bindParam('IdSupervisor', $TblPuntoVenta->IdSupervisor);
        $statement->bindParam('IdRepresentante', $TblPuntoVenta->IdRepresentante);
        $statement->bindParam('Activo', $TblPuntoVenta->Activo);
        $statement->bindParam('IdPais', $TblPuntoVenta->IdPais);
        $statement->bindParam('field1', $TblPuntoVenta->field1);
        $statement->bindParam('field2', $TblPuntoVenta->field2);
        $statement->bindParam('field3', $TblPuntoVenta->field3);
        $statement->bindParam('field4', $TblPuntoVenta->field4);
        $statement->bindParam('field5', $TblPuntoVenta->field5);

        $statement->execute();

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

    public function update(object $TblPuntoVenta, object $data): object
    {
        if (isset($data->fecha)) {
            $TblPuntoVenta->fecha = $data->fecha;
        }
        if (isset($data->Codigo)) {
            $TblPuntoVenta->Codigo = $data->Codigo;
        }
        if (isset($data->Nombre)) {
            $TblPuntoVenta->Nombre = $data->Nombre;
        }
        if (isset($data->IdCanal)) {
            $TblPuntoVenta->IdCanal = $data->IdCanal;
        }
        if (isset($data->Direccion)) {
            $TblPuntoVenta->Direccion = $data->Direccion;
        }
        if (isset($data->IdDepartamento)) {
            $TblPuntoVenta->IdDepartamento = $data->IdDepartamento;
        }
        if (isset($data->IdCiudad)) {
            $TblPuntoVenta->IdCiudad = $data->IdCiudad;
        }
        if (isset($data->IdSupervisor)) {
            $TblPuntoVenta->IdSupervisor = $data->IdSupervisor;
        }
        if (isset($data->IdRepresentante)) {
            $TblPuntoVenta->IdRepresentante = $data->IdRepresentante;
        }
        if (isset($data->Activo)) {
            $TblPuntoVenta->Activo = $data->Activo;
        }
        if (isset($data->IdPais)) {
            $TblPuntoVenta->IdPais = $data->IdPais;
        }
        if (isset($data->field1)) {
            $TblPuntoVenta->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblPuntoVenta->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblPuntoVenta->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblPuntoVenta->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblPuntoVenta->field5 = $data->field5;
        }

        $query = 'UPDATE `TblPuntoVenta` SET `fecha` = :fecha, `Codigo` = :Codigo, `Nombre` = :Nombre, `IdCanal` = :IdCanal, `Direccion` = :Direccion, `IdDepartamento` = :IdDepartamento, `IdCiudad` = :IdCiudad, `IdSupervisor` = :IdSupervisor, `IdRepresentante` = :IdRepresentante, `Activo` = :Activo, `IdPais` = :IdPais, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblPuntoVenta->id);
        $statement->bindParam('fecha', $TblPuntoVenta->fecha);
        $statement->bindParam('Codigo', $TblPuntoVenta->Codigo);
        $statement->bindParam('Nombre', $TblPuntoVenta->Nombre);
        $statement->bindParam('IdCanal', $TblPuntoVenta->IdCanal);
        $statement->bindParam('Direccion', $TblPuntoVenta->Direccion);
        $statement->bindParam('IdDepartamento', $TblPuntoVenta->IdDepartamento);
        $statement->bindParam('IdCiudad', $TblPuntoVenta->IdCiudad);
        $statement->bindParam('IdSupervisor', $TblPuntoVenta->IdSupervisor);
        $statement->bindParam('IdRepresentante', $TblPuntoVenta->IdRepresentante);
        $statement->bindParam('Activo', $TblPuntoVenta->Activo);
        $statement->bindParam('IdPais', $TblPuntoVenta->IdPais);
        $statement->bindParam('field1', $TblPuntoVenta->field1);
        $statement->bindParam('field2', $TblPuntoVenta->field2);
        $statement->bindParam('field3', $TblPuntoVenta->field3);
        $statement->bindParam('field4', $TblPuntoVenta->field4);
        $statement->bindParam('field5', $TblPuntoVenta->field5);

        $statement->execute();

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

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