<?php


namespace App\Models;

use App\Entities\Agenda\Agenda;
use App\Utils\Collections\GeneralCollection;
use App\Utils\DateUtils;

class AgendaModel extends ModelEntity {
	protected $table = 'agenda';
	protected $primaryKey = 'id';
	protected $returnType = 'array';
	protected $allowedFields = [ 
		'codigo',
		'id_medico',
		'id_assistente',
		'id_unidade',
		'data',
		'hora_inicio',
		'hora_final',
		'id_tipo_procedimento',
		'adicionado_por',
		'alterado_por',
		'criado_em',
		'alterado_em'
	];
	protected $useSoftDeletes = false;
	protected $useTimestamps = true;
	protected $skipValidation = true;
	protected $createdField = 'criado_em';
	protected $updatedField = 'alterado_em';

	public function registerAgenda(Agenda $agenda) {

		$data = $agenda->toArray( true );
		$id_agenda = $this->insert( $data );
		$agenda->setId( $id_agenda );

	}

	public function registerAgendaCollection(GeneralCollection $agendas): bool {

		if ($agendas->length === 0) {
			return true;
		}
		$sql = 'INSERT INTO agenda (
                    codigo,
                    id_medico,
                    id_unidade,
                    `data`,
                    `hora_inicio`,
                    `hora_final`,
                    `id_tipo_procedimento`,
                    `adicionado_por`,
                    `criado_em`
                ) VALUES ();
        ';
		$today = DateUtils::today();
		$values = $agendas->map( 
			function (Agenda $agenda) use ($today): string {
				$sql = "(
                '{$agenda->getCodigo()}',   
                {$agenda->getIdMEDICO()},   
                {$agenda->getIdUnidade()},   
                '{$agenda->getData()}',   
                '{$agenda->getHoraInicio()}',   
                '{$agenda->getHoraFinal()}',   
                {$agenda->getIdTIPOPROCEDIMENTO()},   
                {$agenda->getAdicionadoPor()},   
                '{$today}'
            )";
				return preg_replace( '/\s/', '', $sql );
			} )
			->join( ',' );
		$sql = str_replace( 'VALUES ()', "VALUES $values;", $sql );
		$query = $this->db->query( $sql );
		return $query->connID->affected_rows === $agendas->length;

	}

	public function updateAgendaByID(int $id_agenda, Agenda $agenda): bool {

		$data = $agenda->toArray( true );
		$data ['alterado_em'] = DateUtils::now();
		$binds = [ 
			'id_agenda' => $id_agenda
		];
		$sets = $this->generateUpdateSets( $data, $binds );
		$sql = "UPDATE agenda $sets WHERE agenda.id = :id_agenda:";
		$query = $this->db->query( $sql, $binds );
		return $query->connID->affected_rows === 1;

	}

}
