<?php

declare(strict_types=1);

namespace App\Repository;

final class TblTemaXUsuarioRepository
{
    private \PDO $database;

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

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

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

        return $TblTemaXUsuario;
    }

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

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

    public function create(object $TblTemaXUsuario): object
    {
        $query = 'INSERT INTO `TblTemaXUsuario` (`IdUsuario`, `IdTema`, `IdEstado`, `Calificacion`, `NumeroIntentosRealizados`, `FechaUltimoIntento`, `PorcentajeAvance`, `field1`, `field2`, `field3`, 
        `field4`, `field5`) VALUES (:IdUsuario, :IdTema, :IdEstado, :Calificacion, :NumeroIntentosRealizados, :FechaUltimoIntento, :PorcentajeAvance, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblTemaXUsuario->id);
//         $statement->bindParam('fecha', $TblTemaXUsuario->fecha);
        $statement->bindParam('IdUsuario', $TblTemaXUsuario->IdUsuario);
        $statement->bindParam('IdTema', $TblTemaXUsuario->IdTema);
        $statement->bindParam('IdEstado', $TblTemaXUsuario->IdEstado);
        $statement->bindParam('Calificacion', $TblTemaXUsuario->Calificacion);
        $statement->bindParam('NumeroIntentosRealizados', $TblTemaXUsuario->NumeroIntentosRealizados);
        $statement->bindParam('FechaUltimoIntento', $TblTemaXUsuario->FechaUltimoIntento);
        $statement->bindParam('PorcentajeAvance', $TblTemaXUsuario->PorcentajeAvance);
        $statement->bindParam('field1', $TblTemaXUsuario->field1);
        $statement->bindParam('field2', $TblTemaXUsuario->field2);
        $statement->bindParam('field3', $TblTemaXUsuario->field3);
        $statement->bindParam('field4', $TblTemaXUsuario->field4);
        $statement->bindParam('field5', $TblTemaXUsuario->field5);

        $statement->execute();

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

    public function update(object $TblTemaXUsuario, object $data): object
    {
        if (isset($data->fecha)) {
            $TblTemaXUsuario->fecha = $data->fecha;
        }
        if (isset($data->IdUsuario)) {
            $TblTemaXUsuario->IdUsuario = $data->IdUsuario;
        }
        if (isset($data->IdTema)) {
            $TblTemaXUsuario->IdTema = $data->IdTema;
        }
        if (isset($data->IdEstado)) {
            $TblTemaXUsuario->IdEstado = $data->IdEstado;
        }
        if (isset($data->Calificacion)) {
            $TblTemaXUsuario->Calificacion = $data->Calificacion;
        }
        if (isset($data->NumeroIntentosRealizados)) {
            $TblTemaXUsuario->NumeroIntentosRealizados = $data->NumeroIntentosRealizados;
        }
        if (isset($data->FechaUltimoIntento)) {
            $TblTemaXUsuario->FechaUltimoIntento = $data->FechaUltimoIntento;
        }
        if (isset($data->PorcentajeAvance)) {
            $TblTemaXUsuario->PorcentajeAvance = $data->PorcentajeAvance;
        }
        if (isset($data->field1)) {
            $TblTemaXUsuario->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblTemaXUsuario->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblTemaXUsuario->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblTemaXUsuario->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblTemaXUsuario->field5 = $data->field5;
        }

        $query = 'UPDATE `TblTemaXUsuario` SET `fecha` = :fecha, `IdUsuario` = :IdUsuario, `IdTema` = :IdTema, `IdEstado` = :IdEstado, `Calificacion` = :Calificacion, `NumeroIntentosRealizados` = :NumeroIntentosRealizados, `FechaUltimoIntento` = :FechaUltimoIntento, `PorcentajeAvance` = :PorcentajeAvance, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblTemaXUsuario->id);
        $statement->bindParam('fecha', $TblTemaXUsuario->fecha);
        $statement->bindParam('IdUsuario', $TblTemaXUsuario->IdUsuario);
        $statement->bindParam('IdTema', $TblTemaXUsuario->IdTema);
        $statement->bindParam('IdEstado', $TblTemaXUsuario->IdEstado);
        $statement->bindParam('Calificacion', $TblTemaXUsuario->Calificacion);
        $statement->bindParam('NumeroIntentosRealizados', $TblTemaXUsuario->NumeroIntentosRealizados);
        $statement->bindParam('FechaUltimoIntento', $TblTemaXUsuario->FechaUltimoIntento);
        $statement->bindParam('PorcentajeAvance', $TblTemaXUsuario->PorcentajeAvance);
        $statement->bindParam('field1', $TblTemaXUsuario->field1);
        $statement->bindParam('field2', $TblTemaXUsuario->field2);
        $statement->bindParam('field3', $TblTemaXUsuario->field3);
        $statement->bindParam('field4', $TblTemaXUsuario->field4);
        $statement->bindParam('field5', $TblTemaXUsuario->field5);

        $statement->execute();

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

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