<?php

declare(strict_types=1);

namespace App\Repository;

final class TblModuloXUsuarioRepository
{
    private \PDO $database;

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

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

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

        return $TblModuloXUsuario;
    }

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

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

    public function create(object $TblModuloXUsuario): object
    {
        $query = 'INSERT INTO `TblModuloXUsuario` (`IdModulo`, `EstadoRta`, `Estado`, `IdValorTipo`, `IdUsuario`, `Calificacion`, `Observacion`, `ExperienciaUsuario`, `FechaCalificacionExperiencia`, 
        `field1`, `field2`, `field3`, `field4`, `field5`) VALUES (:IdModulo, :EstadoRta, :Estado, :IdValorTipo, :IdUsuario, :Calificacion, :Observacion, :ExperienciaUsuario, :FechaCalificacionExperiencia, 
        :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblModuloXUsuario->id);
//         $statement->bindParam('fecha', $TblModuloXUsuario->fecha);
        $statement->bindParam('IdModulo', $TblModuloXUsuario->IdModulo);
        $statement->bindParam('EstadoRta', $TblModuloXUsuario->EstadoRta);
        $statement->bindParam('Estado', $TblModuloXUsuario->Estado);
        $statement->bindParam('IdValorTipo', $TblModuloXUsuario->IdValorTipo);
        $statement->bindParam('IdUsuario', $TblModuloXUsuario->IdUsuario);
        $statement->bindParam('Calificacion', $TblModuloXUsuario->Calificacion);
        $statement->bindParam('Observacion', $TblModuloXUsuario->Observacion);
        $statement->bindParam('ExperienciaUsuario', $TblModuloXUsuario->ExperienciaUsuario);
        $statement->bindParam('FechaCalificacionExperiencia', $TblModuloXUsuario->FechaCalificacionExperiencia);
        $statement->bindParam('field1', $TblModuloXUsuario->field1);
        $statement->bindParam('field2', $TblModuloXUsuario->field2);
        $statement->bindParam('field3', $TblModuloXUsuario->field3);
        $statement->bindParam('field4', $TblModuloXUsuario->field4);
        $statement->bindParam('field5', $TblModuloXUsuario->field5);

        $statement->execute();

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

    public function update(object $TblModuloXUsuario, object $data): object
    {
        if (isset($data->fecha)) {
            $TblModuloXUsuario->fecha = $data->fecha;
        }
        if (isset($data->IdModulo)) {
            $TblModuloXUsuario->IdModulo = $data->IdModulo;
        }
        if (isset($data->EstadoRta)) {
            $TblModuloXUsuario->EstadoRta = $data->EstadoRta;
        }
        if (isset($data->Estado)) {
            $TblModuloXUsuario->Estado = $data->Estado;
        }
        if (isset($data->IdValorTipo)) {
            $TblModuloXUsuario->IdValorTipo = $data->IdValorTipo;
        }
        if (isset($data->IdUsuario)) {
            $TblModuloXUsuario->IdUsuario = $data->IdUsuario;
        }
        if (isset($data->Calificacion)) {
            $TblModuloXUsuario->Calificacion = $data->Calificacion;
        }
        if (isset($data->Observacion)) {
            $TblModuloXUsuario->Observacion = $data->Observacion;
        }
        if (isset($data->ExperienciaUsuario)) {
            $TblModuloXUsuario->ExperienciaUsuario = $data->ExperienciaUsuario;
        }
        if (isset($data->FechaCalificacionExperiencia)) {
            $TblModuloXUsuario->FechaCalificacionExperiencia = $data->FechaCalificacionExperiencia;
        }
        if (isset($data->field1)) {
            $TblModuloXUsuario->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblModuloXUsuario->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblModuloXUsuario->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblModuloXUsuario->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblModuloXUsuario->field5 = $data->field5;
        }

        $query = 'UPDATE `TblModuloXUsuario` SET `fecha` = :fecha, `IdModulo` = :IdModulo, `EstadoRta` = :EstadoRta, `Estado` = :Estado, `IdValorTipo` = :IdValorTipo, `IdUsuario` = :IdUsuario, `Calificacion` = :Calificacion, `Observacion` = :Observacion, `ExperienciaUsuario` = :ExperienciaUsuario, `FechaCalificacionExperiencia` = :FechaCalificacionExperiencia, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblModuloXUsuario->id);
        $statement->bindParam('fecha', $TblModuloXUsuario->fecha);
        $statement->bindParam('IdModulo', $TblModuloXUsuario->IdModulo);
        $statement->bindParam('EstadoRta', $TblModuloXUsuario->EstadoRta);
        $statement->bindParam('Estado', $TblModuloXUsuario->Estado);
        $statement->bindParam('IdValorTipo', $TblModuloXUsuario->IdValorTipo);
        $statement->bindParam('IdUsuario', $TblModuloXUsuario->IdUsuario);
        $statement->bindParam('Calificacion', $TblModuloXUsuario->Calificacion);
        $statement->bindParam('Observacion', $TblModuloXUsuario->Observacion);
        $statement->bindParam('ExperienciaUsuario', $TblModuloXUsuario->ExperienciaUsuario);
        $statement->bindParam('FechaCalificacionExperiencia', $TblModuloXUsuario->FechaCalificacionExperiencia);
        $statement->bindParam('field1', $TblModuloXUsuario->field1);
        $statement->bindParam('field2', $TblModuloXUsuario->field2);
        $statement->bindParam('field3', $TblModuloXUsuario->field3);
        $statement->bindParam('field4', $TblModuloXUsuario->field4);
        $statement->bindParam('field5', $TblModuloXUsuario->field5);

        $statement->execute();

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

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