<?php

declare(strict_types=1);

namespace App\Repository;

final class TblOfertaRepository
{
    private \PDO $database;

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

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

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

        return $TblOferta;
    }

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

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

    public function create(object $TblOferta): object
    {
        $query = 'INSERT INTO `TblOferta` (`IdUsuario`, `IdPuntoVenta`, `IdRol`, `IdPais`, `IdDepartamento`, `IdCiudad`, `Rol`, `CorreoElectronico`, `PaginaWeb`, `DescripcionOferta`, `CantidadVacantes`, 
        `FechaCierreOferta`, `FechaPublicacion`, `Estado`, `EsConfidencial`, `field1`, `field2`, `field3`, `field4`, `field5`) VALUES (:IdUsuario, :IdPuntoVenta, :IdRol, :IdPais, :IdDepartamento, :IdCiudad, :Rol, :CorreoElectronico, :PaginaWeb, :DescripcionOferta, :CantidadVacantes, :FechaCierreOferta, :FechaPublicacion, :Estado, :EsConfidencial, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblOferta->id);
//         $statement->bindParam('fecha', $TblOferta->fecha);
        $statement->bindParam('IdUsuario', $TblOferta->IdUsuario);
        $statement->bindParam('IdPuntoVenta', $TblOferta->IdPuntoVenta);
        $statement->bindParam('IdRol', $TblOferta->IdRol);
        $statement->bindParam('IdPais', $TblOferta->IdPais);
        $statement->bindParam('IdDepartamento', $TblOferta->IdDepartamento);
        $statement->bindParam('IdCiudad', $TblOferta->IdCiudad);
        $statement->bindParam('Rol', $TblOferta->Rol);
        $statement->bindParam('CorreoElectronico', $TblOferta->CorreoElectronico);
        $statement->bindParam('PaginaWeb', $TblOferta->PaginaWeb);
        $statement->bindParam('DescripcionOferta', $TblOferta->DescripcionOferta);
        $statement->bindParam('CantidadVacantes', $TblOferta->CantidadVacantes);
        $statement->bindParam('FechaCierreOferta', $TblOferta->FechaCierreOferta);
        $statement->bindParam('FechaPublicacion', $TblOferta->FechaPublicacion);
        $statement->bindParam('Estado', $TblOferta->Estado);
        $statement->bindParam('EsConfidencial', $TblOferta->EsConfidencial);
        $statement->bindParam('field1', $TblOferta->field1);
        $statement->bindParam('field2', $TblOferta->field2);
        $statement->bindParam('field3', $TblOferta->field3);
        $statement->bindParam('field4', $TblOferta->field4);
        $statement->bindParam('field5', $TblOferta->field5);

        $statement->execute();

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

    public function update(object $TblOferta, object $data): object
    {
        if (isset($data->fecha)) {
            $TblOferta->fecha = $data->fecha;
        }
        if (isset($data->IdUsuario)) {
            $TblOferta->IdUsuario = $data->IdUsuario;
        }
        if (isset($data->IdPuntoVenta)) {
            $TblOferta->IdPuntoVenta = $data->IdPuntoVenta;
        }
        if (isset($data->IdRol)) {
            $TblOferta->IdRol = $data->IdRol;
        }
        if (isset($data->IdPais)) {
            $TblOferta->IdPais = $data->IdPais;
        }
        if (isset($data->IdDepartamento)) {
            $TblOferta->IdDepartamento = $data->IdDepartamento;
        }
        if (isset($data->IdCiudad)) {
            $TblOferta->IdCiudad = $data->IdCiudad;
        }
        if (isset($data->Rol)) {
            $TblOferta->Rol = $data->Rol;
        }
        if (isset($data->CorreoElectronico)) {
            $TblOferta->CorreoElectronico = $data->CorreoElectronico;
        }
        if (isset($data->PaginaWeb)) {
            $TblOferta->PaginaWeb = $data->PaginaWeb;
        }
        if (isset($data->DescripcionOferta)) {
            $TblOferta->DescripcionOferta = $data->DescripcionOferta;
        }
        if (isset($data->CantidadVacantes)) {
            $TblOferta->CantidadVacantes = $data->CantidadVacantes;
        }
        if (isset($data->FechaCierreOferta)) {
            $TblOferta->FechaCierreOferta = $data->FechaCierreOferta;
        }
        if (isset($data->FechaPublicacion)) {
            $TblOferta->FechaPublicacion = $data->FechaPublicacion;
        }
        if (isset($data->Estado)) {
            $TblOferta->Estado = $data->Estado;
        }
        if (isset($data->EsConfidencial)) {
            $TblOferta->EsConfidencial = $data->EsConfidencial;
        }
        if (isset($data->field1)) {
            $TblOferta->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblOferta->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblOferta->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblOferta->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblOferta->field5 = $data->field5;
        }

        $query = 'UPDATE `TblOferta` SET `fecha` = :fecha, `IdUsuario` = :IdUsuario, `IdPuntoVenta` = :IdPuntoVenta, `IdRol` = :IdRol, `IdPais` = :IdPais, `IdDepartamento` = :IdDepartamento, `IdCiudad` = :IdCiudad, `Rol` = :Rol, `CorreoElectronico` = :CorreoElectronico, `PaginaWeb` = :PaginaWeb, `DescripcionOferta` = :DescripcionOferta, `CantidadVacantes` = :CantidadVacantes, `FechaCierreOferta` = :FechaCierreOferta, `FechaPublicacion` = :FechaPublicacion, `Estado` = :Estado, `EsConfidencial` = :EsConfidencial, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblOferta->id);
        $statement->bindParam('fecha', $TblOferta->fecha);
        $statement->bindParam('IdUsuario', $TblOferta->IdUsuario);
        $statement->bindParam('IdPuntoVenta', $TblOferta->IdPuntoVenta);
        $statement->bindParam('IdRol', $TblOferta->IdRol);
        $statement->bindParam('IdPais', $TblOferta->IdPais);
        $statement->bindParam('IdDepartamento', $TblOferta->IdDepartamento);
        $statement->bindParam('IdCiudad', $TblOferta->IdCiudad);
        $statement->bindParam('Rol', $TblOferta->Rol);
        $statement->bindParam('CorreoElectronico', $TblOferta->CorreoElectronico);
        $statement->bindParam('PaginaWeb', $TblOferta->PaginaWeb);
        $statement->bindParam('DescripcionOferta', $TblOferta->DescripcionOferta);
        $statement->bindParam('CantidadVacantes', $TblOferta->CantidadVacantes);
        $statement->bindParam('FechaCierreOferta', $TblOferta->FechaCierreOferta);
        $statement->bindParam('FechaPublicacion', $TblOferta->FechaPublicacion);
        $statement->bindParam('Estado', $TblOferta->Estado);
        $statement->bindParam('EsConfidencial', $TblOferta->EsConfidencial);
        $statement->bindParam('field1', $TblOferta->field1);
        $statement->bindParam('field2', $TblOferta->field2);
        $statement->bindParam('field3', $TblOferta->field3);
        $statement->bindParam('field4', $TblOferta->field4);
        $statement->bindParam('field5', $TblOferta->field5);

        $statement->execute();

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

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