<?php

namespace App\Models;

use App\Entities\Agendamento\Agendamento;
use App\Utils\DateUtils;

class AgendamentoModel extends ModelEntity {
	protected $table = 'agendamento';
	protected $primaryKey = 'id';
	protected $returnType = 'array';
	protected $allowedFields = [ 
		'id_agenda',
		'id_cliente',
		'id_paciente',
		'id_procedimento',
		'id_requisicao',
		'codigo',
		'cancelado_em',
		'adicionado_por',
		'alterado_por'
	];
	protected $useSoftDeletes = false;
	protected $useTimestamps = true;
	protected $skipValidation = true;
	protected $createdField = 'criado_em';
	protected $updatedField = 'alterado_em';

	public function registerAgendamento(Agendamento $agendamento): void {

		$data = $agendamento->toArray( true );
		$id_agendamento = $this->insert( $data );
		$agendamento->setId( $id_agendamento );

	}

	public function cancelAgendamento(int $id_agendamento): int {

		$sql = "
            UPDATE
                agendamento
            SET 
                codigo = REPLACE(CONCAT(codigo, '_', :cancelado_em:), '-', '') ,
                cancelado_em = :cancelado_em:
            WHERE 
                id = :id_agendamento: AND
                (agendamento.cancelado_em = '1900-01-01 00:00:00' OR agendamento.cancelado_em is null)
        ";
		$query = $this->db->query( $sql, [ 
			'id_agendamento' => $id_agendamento,
			'cancelado_em' => DateUtils::now()
		] );
		return $query->connID->affected_rows;

	}


    # ---------------------------------------------------------------- #
    public function cancelAgendamentoTelevet(int $id_agendamento): int
    {
        $this->db->transStart(); // Inicia uma transação

        // Verifica se o agendamento existe
        $agendamentoExists = $this->agendamentoExists($id_agendamento);

        if (!$agendamentoExists) {
            $this->db->transRollback(); // Cancela a transação
            return 0; // Agendamento não encontrado, nenhum registro afetado
        }

        // Deleta o registro da tabela 'requisicao_sala_video'
        $this->deleteSalaVideo($agendamentoExists[0]['id_requisicao']);

        $this->deleteAgendamentoPet($id_agendamento);

        // Deleta o registro da tabela 'agendamento'
        $affectedRows = $this->deleteAgendamento($id_agendamento);
        if (!$affectedRows) {
            $this->db->transRollback(); // Cancela a transação
            return 0; // Agendamento não encontrado, nenhum registro afetado
        }

        // Deleta o registro da tabela 'agendamento'
        $affectedRows = $this->deleteAgendamentoEspecialidade($agendamentoExists[0]['id_requisicao']);
        if (!$affectedRows) {
            $this->db->transRollback(); // Cancela a transação
            return 0; // Agendamento não encontrado, nenhum registro afetado
        }


        // Deleta o registro da tabela 'agendamento'
        $affectedRows = $this->deleteRequisicaoProcedimento($agendamentoExists[0]['id_requisicao']);
        if (!$affectedRows) {
            $this->db->transRollback(); // Cancela a transação
            return 0; // Agendamento não encontrado, nenhum registro afetado
        }

        // Deleta o registro da tabela 'agenda'
        $this->deleteAgenda($agendamentoExists[0]['id_agenda']);

        $this->db->transComplete(); // Completa a transação

        return $affectedRows;
    }

    private function agendamentoExists(int $id_agendamento)
    {
        $sql = "
        SELECT *
        FROM agendamento
        WHERE id = ?
    ";

        return $this->db->query($sql, [$id_agendamento])->getResultArray();
    }

    private function deleteSalaVideo(int $id_requisicao): void
    {
        $sql = "DELETE FROM requisicao_sala_video WHERE id_requisicao_procedimento = ?";
        $this->db->query($sql, [$id_requisicao]);
    }

    private function deleteAgenda(int $id): void
    {
        $sql = "DELETE FROM agenda WHERE id = ?";
        $this->db->query($sql, [$id]);
    }

    private function deleteAgendamentoPet(int $id_agendamento): void
    {
        $sql = "DELETE FROM agendamento_pet WHERE id_agendamento = ?";
        $this->db->query($sql, [$id_agendamento]);
    }

    private function deleteAgendamento(int $id_agendamento): int
    {
        $sql = "
        DELETE FROM agendamento WHERE id = ?
        ";

        $this->db->query($sql, [$id_agendamento]);
        return $this->db->affectedRows();
    }

    private function deleteAgendamentoEspecialidade(int $id_requisicao): int
    {
        $sql = "
        DELETE FROM agendamento_especialidade WHERE id_requisicao_procedimento = ?
        ";

        $this->db->query($sql, [$id_requisicao]);
        return $this->db->affectedRows();
    }

    private function deleteRequisicaoProcedimento(int $id_requisicao): int
    {
        $sql = "
        DELETE FROM requisicao_procedimento WHERE id = ?
        ";

        $this->db->query($sql, [$id_requisicao]);
        return $this->db->affectedRows();
    }

    # ---------------------------------------------------------------- #







	public function updateAgendamento(int $id_agendamento, Agendamento $agendamento): bool {

		$data = $agendamento->toArray( true );
		if (count( $data ) > 0) {
			$binds = [ 
				'id_agendamento' => $id_agendamento
			];
			$sql = "
                UPDATE agendamento
            ";
			$sql .= $this->generateUpdateSets( $data, $binds );
			$sql .= ' WHERE id = :id_agendamento:';
			$query = $this->db->query( $sql, $binds );
			return $query->connID->affected_rows === 1 || !$this->errors();
		} else {
			return false;
		}

	}

}
