<?php

namespace app\DAO;

use App\DAO\DAO;
use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\Services\JWT\UsuarioLogado;
use App\Utils\DateUtils;
use App\ViewModels\AgendaEspecialidade\AgendaEspecialidadeDisponibilidadeRegistrationViewModel\AgendaEspecialidadeDisponibilidadeRegistrationViewModel;

class AgendaEspecialidadeDisponibilidadeDAO extends DAO {

	public function registerAgendaEspecialidadeDisponibilidade(array $agenda): DAOResponse {

		$dao_response = new DAOResponse();

		$sql = <<<SQL
			insert into agenda_especialidade_disponibilidade
			(id_unidade,id_especialidade,data_disponibilidade,hora_inicial,hora_final,criado_por,data_criacao,hora_criacao,ativo,crc)
			values
			(:unidade_id:,:especialidade_id:,:data_disp:,:hora_ini:,:hora_fim:,:usr_id:,:data_cr:,:hora_cr:,:atv:,:cod:)
		SQL;

		$lista_erros = [ ];
		$lista_ok = [ ];
		$conn = db_connect();
		for($i = 0; $i < count( $agenda ); $i++) {

			$obj = $agenda [$i];
			$binds = [ 
				'unidade_id' => $obj->getIdUnidade(),
				'especialidade_id' => $obj->getIdEspecialidade(),
				'data_disp' => $obj->getDataDisponibilidade(),
				'hora_ini' => $obj->getHoraInicial(),
				'hora_fim' => $obj->getHoraFinal(),
				'usr_id' => $obj->getCriadoPor(),
				'data_cr' => $obj->getDataCriacao(),
				'hora_cr' => $obj->getHoraCriacao(),
				'atv' => $obj->getAtivo(),
				'cod' => $obj->getCrc()
			];

			$conn->query( $sql, $binds );
			$errors = $conn->error();

			if ($errors ['code'] != 0) {
				array_push( $lista_erros, $errors );
			} else {
				$newid = $conn->insertID();
				$ok = [ 
					'data_config' => $obj->getDataDisponibilidade(),
					'id' => $newid
				];
				array_push( $lista_ok, $ok );
			}
		}
		$conn->close();
		if (count( $lista_ok ) == 0) {
			$dao_response->setErrors( $lista_erros );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			return $dao_response;
		}
		if (count( $lista_erros ) == 0) {
			$dao_response->setStatus( DAOResponseInterface::SUCESS );
			$dao_response->setData( $lista_ok );
			return $dao_response;
		}

		$dao_response->setStatus( DAOResponseInterface::UNKNOWN_ERROR );
		$dao_response->setErrors( $lista_erros );
		$dao_response->setData( $lista_ok );
		return $dao_response;

	}

	public function getDatasToRegister(AgendaEspecialidadeDisponibilidadeRegistrationViewModel $agenda): DAOResponse {

		$sql = <<<SQL
			select distinct ae.`data`  from agenda_especialidade ae
			where
				ae.id_unidade = :unidade_id:
				and id_especialidade = :especialidade_id:
				and ae.`data` >= :data_inicial:
				and ae.`data` <= :data_final:
			order by ae.`data` asc
		SQL;
		$binds = [ 
			'unidade_id' => $agenda->getIdUnidade(),
			'especialidade_id' => $agenda->getIdEspecialidade(),
			'data_inicial' => $agenda->getDataInicial(),
			'data_final' => $agenda->getDataFinal()
		];

		$dao_response = new DAOResponse();
		$conn = db_connect();
		$resp = $conn->query( $sql, $binds )
			->getResultArray();
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			return $dao_response;
		}
		$dao_response->setStatus( DAOResponseInterface::SUCESS );
		$dao_response->setData( $resp );
		return $dao_response;

	}

	public function getAgendaEspecialidadeDisponibilidade(int $idUnidade, int $idEspecialidade, string $dataInicial, string $dataFinal): DAOResponse {

		$sql = <<<SQL
			select
				aed.id ,aed.id_unidade , un.descricao as unidade,
				aed.id_especialidade, e.descricao as especialidade ,
				aed.ativo, aed.data_disponibilidade,
				aed.hora_inicial , aed.hora_final
			from 
				agenda_especialidade_disponibilidade aed , 
				unidade un , especialidade e
			where
				aed.id_unidade = :unidade_id:
				and aed.id_unidade = un.id
				and aed.id_especialidade = :especialidade_id:
				and aed.id_especialidade = e.id
				and aed.data_disponibilidade >=:data_inicial:
				and aed.data_disponibilidade <=:data_final:
		SQL;
		$binds = [ 
			'unidade_id' => $idUnidade,
			'especialidade_id' => $idEspecialidade,
			'data_inicial' => $dataInicial,
			'data_final' => $dataFinal
		];

		$dao_response = new DAOResponse();
		$conn = db_connect();
		$resp = $conn->query( $sql, $binds )
			->getResultArray();
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			return $dao_response;
		}
		$dao_response->setStatus( DAOResponseInterface::SUCESS );
		$dao_response->setData( $resp );
		return $dao_response;

	}

	public function updateAgendaEspecialidadeDisponibilidade(int $idAgenda, int $ativo): DAOResponse {

		$usr = UsuarioLogado::getUsuarioId();
		$dia = DateUtils::today();
		$hora = DateUtils::now_time();
		$sql = <<<SQL
			update
				agenda_especialidade_disponibilidade
			set
				ativo =:ativo_id:,
				alterado_por = :usuario_id:,
				data_alteracao = :data_alter:,
				hora_alteracao = :hora_alter:				
			where
				id = :agenda_id: 
				
		SQL;
		$binds = [ 
			'agenda_id' => $idAgenda,
			'ativo_id' => $ativo,
			'usuario_id' => $usr,
			'data_alter' => $dia,
			'hora_alter' => $hora
		];

		$dao_response = new DAOResponse();
		$conn = db_connect();
		$conn->query( $sql, $binds )->numRows;
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			return $dao_response;
		}
		$affects = $conn->affectedRows();
		$dao_response->setStatus( DAOResponseInterface::SUCESS );
		$dao_response->setData( [ 
			'registros' => $affects
		] );
		return $dao_response;

	}

}

