<?php

declare(strict_types=1);

namespace App\Repository;

final class TblCursoRepository
{
    private \PDO $database;

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

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

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

        return $TblCurso;
    }

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

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

    public function create(object $TblCurso): object
    {
        $query = 'INSERT INTO `TblCurso` (`Nombre`, `Descripcion`, `Duracion`, `RutaImagen`, `Color`, `CalificacionMinima`, `CorreoContacto`, `TelefonoContacto`, `TerminosYCondiciones`, 
        `PastillasPorModulo`, `RequisitosGrado`, `IdPais`, `TipoCurso`, `CodigoCertificado`, `TiempoDuracion`, `QueAprenderas`, `field1`, `field2`, `field3`, `field4`, `field5`) VALUES (:Nombre, 
        :Descripcion, :Duracion, :RutaImagen, :Color, :CalificacionMinima, :CorreoContacto, :TelefonoContacto, :TerminosYCondiciones, :PastillasPorModulo, :RequisitosGrado, :IdPais, :TipoCurso, 
        :CodigoCertificado, :TiempoDuracion, :QueAprenderas, :field1, :field2, :field3, :field4, :field5)';
        $statement = $this->getDb()->prepare($query);
//         $statement->bindParam('id', $TblCurso->id);
//         $statement->bindParam('fecha', $TblCurso->fecha);
        $statement->bindParam('Nombre', $TblCurso->Nombre);
        $statement->bindParam('Descripcion', $TblCurso->Descripcion);
        $statement->bindParam('Duracion', $TblCurso->Duracion);
        $statement->bindParam('RutaImagen', $TblCurso->RutaImagen);
        $statement->bindParam('Color', $TblCurso->Color);
        $statement->bindParam('CalificacionMinima', $TblCurso->CalificacionMinima);
        $statement->bindParam('CorreoContacto', $TblCurso->CorreoContacto);
        $statement->bindParam('TelefonoContacto', $TblCurso->TelefonoContacto);
        $statement->bindParam('TerminosYCondiciones', $TblCurso->TerminosYCondiciones);
        $statement->bindParam('PastillasPorModulo', $TblCurso->PastillasPorModulo);
        $statement->bindParam('RequisitosGrado', $TblCurso->RequisitosGrado);
        $statement->bindParam('IdPais', $TblCurso->IdPais);
        $statement->bindParam('TipoCurso', $TblCurso->TipoCurso);
        $statement->bindParam('CodigoCertificado', $TblCurso->CodigoCertificado);
        $statement->bindParam('TiempoDuracion', $TblCurso->TiempoDuracion);
        $statement->bindParam('QueAprenderas', $TblCurso->QueAprenderas);
        $statement->bindParam('field1', $TblCurso->field1);
        $statement->bindParam('field2', $TblCurso->field2);
        $statement->bindParam('field3', $TblCurso->field3);
        $statement->bindParam('field4', $TblCurso->field4);
        $statement->bindParam('field5', $TblCurso->field5);

        $statement->execute();

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

    public function update(object $TblCurso, object $data): object
    {
        if (isset($data->fecha)) {
            $TblCurso->fecha = $data->fecha;
        }
        if (isset($data->Nombre)) {
            $TblCurso->Nombre = $data->Nombre;
        }
        if (isset($data->Descripcion)) {
            $TblCurso->Descripcion = $data->Descripcion;
        }
        if (isset($data->Duracion)) {
            $TblCurso->Duracion = $data->Duracion;
        }
        if (isset($data->RutaImagen)) {
            $TblCurso->RutaImagen = $data->RutaImagen;
        }
        if (isset($data->Color)) {
            $TblCurso->Color = $data->Color;
        }
        if (isset($data->CalificacionMinima)) {
            $TblCurso->CalificacionMinima = $data->CalificacionMinima;
        }
        if (isset($data->CorreoContacto)) {
            $TblCurso->CorreoContacto = $data->CorreoContacto;
        }
        if (isset($data->TelefonoContacto)) {
            $TblCurso->TelefonoContacto = $data->TelefonoContacto;
        }
        if (isset($data->TerminosYCondiciones)) {
            $TblCurso->TerminosYCondiciones = $data->TerminosYCondiciones;
        }
        if (isset($data->PastillasPorModulo)) {
            $TblCurso->PastillasPorModulo = $data->PastillasPorModulo;
        }
        if (isset($data->RequisitosGrado)) {
            $TblCurso->RequisitosGrado = $data->RequisitosGrado;
        }
        if (isset($data->IdPais)) {
            $TblCurso->IdPais = $data->IdPais;
        }
        if (isset($data->TipoCurso)) {
            $TblCurso->TipoCurso = $data->TipoCurso;
        }
        if (isset($data->CodigoCertificado)) {
            $TblCurso->CodigoCertificado = $data->CodigoCertificado;
        }
        if (isset($data->TiempoDuracion)) {
            $TblCurso->TiempoDuracion = $data->TiempoDuracion;
        }
        if (isset($data->QueAprenderas)) {
            $TblCurso->QueAprenderas = $data->QueAprenderas;
        }
        if (isset($data->field1)) {
            $TblCurso->field1 = $data->field1;
        }
        if (isset($data->field2)) {
            $TblCurso->field2 = $data->field2;
        }
        if (isset($data->field3)) {
            $TblCurso->field3 = $data->field3;
        }
        if (isset($data->field4)) {
            $TblCurso->field4 = $data->field4;
        }
        if (isset($data->field5)) {
            $TblCurso->field5 = $data->field5;
        }

        $query = 'UPDATE `TblCurso` SET `fecha` = :fecha, `Nombre` = :Nombre, `Descripcion` = :Descripcion, `Duracion` = :Duracion, `RutaImagen` = :RutaImagen, `Color` = :Color, `CalificacionMinima` = :CalificacionMinima, `CorreoContacto` = :CorreoContacto, `TelefonoContacto` = :TelefonoContacto, `TerminosYCondiciones` = :TerminosYCondiciones, `PastillasPorModulo` = :PastillasPorModulo, `RequisitosGrado` = :RequisitosGrado, `IdPais` = :IdPais, `TipoCurso` = :TipoCurso, `CodigoCertificado` = :CodigoCertificado, `TiempoDuracion` = :TiempoDuracion, `QueAprenderas` = :QueAprenderas, `field1` = :field1, `field2` = :field2, `field3` = :field3, `field4` = :field4, `field5` = :field5 WHERE `id` = :id';
        $statement = $this->getDb()->prepare($query);
        $statement->bindParam('id', $TblCurso->id);
        $statement->bindParam('fecha', $TblCurso->fecha);
        $statement->bindParam('Nombre', $TblCurso->Nombre);
        $statement->bindParam('Descripcion', $TblCurso->Descripcion);
        $statement->bindParam('Duracion', $TblCurso->Duracion);
        $statement->bindParam('RutaImagen', $TblCurso->RutaImagen);
        $statement->bindParam('Color', $TblCurso->Color);
        $statement->bindParam('CalificacionMinima', $TblCurso->CalificacionMinima);
        $statement->bindParam('CorreoContacto', $TblCurso->CorreoContacto);
        $statement->bindParam('TelefonoContacto', $TblCurso->TelefonoContacto);
        $statement->bindParam('TerminosYCondiciones', $TblCurso->TerminosYCondiciones);
        $statement->bindParam('PastillasPorModulo', $TblCurso->PastillasPorModulo);
        $statement->bindParam('RequisitosGrado', $TblCurso->RequisitosGrado);
        $statement->bindParam('IdPais', $TblCurso->IdPais);
        $statement->bindParam('TipoCurso', $TblCurso->TipoCurso);
        $statement->bindParam('CodigoCertificado', $TblCurso->CodigoCertificado);
        $statement->bindParam('TiempoDuracion', $TblCurso->TiempoDuracion);
        $statement->bindParam('QueAprenderas', $TblCurso->QueAprenderas);
        $statement->bindParam('field1', $TblCurso->field1);
        $statement->bindParam('field2', $TblCurso->field2);
        $statement->bindParam('field3', $TblCurso->field3);
        $statement->bindParam('field4', $TblCurso->field4);
        $statement->bindParam('field5', $TblCurso->field5);

        $statement->execute();

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

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