<?php namespace App\Models;

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

class AgendaMedicoModel extends ModelEntity
{
    protected $table = 'agenda_especialidade';
    protected $primaryKey = 'id';
    protected $returnType = 'array';
    protected $allowedFields = [
        'codigo',
        'id_medico',
        'id_unidade',
        'id_especialidade',
        'data',
        'hora_inicio',
        'hora_final',
        '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 registerAgendaMedico (AgendaMedico $agenda) {
        $data = $agenda->toArray(true);
        $id_agenda = $this->insert($data);
        $agenda->setId($id_agenda);
    }

    public function registerAgendaMedicoCollection (GeneralCollection $agendas, bool $encaixe) : bool {
        if ($agendas->length === 0) {
            return true;
        }
        $sql = 'INSERT INTO agenda_especialidade (
                    codigo,
                    id_medico,
                    id_unidade,
                    `data`,
                    `hora_inicio`,
                    `hora_final`,
                    `id_especialidade`,
                    `adicionado_por`,
                    `criado_em`,
                    `encaixe`
                ) VALUES ();
        ';
        $today = DateUtils::today();

        if($encaixe == true):
        $values = $agendas->map(function (AgendaMedico $agenda) use ($today) : string {
            $hora_final_agenda = date('H:i', strtotime($agenda->getHoraFinal()) - 15*60);
            $hora_inicio_encaixe = date('H:i', strtotime($agenda->getHoraFinal()) - 15*60);
        	#$hora_final_agenda = date('H:i', strtotime($agenda->getHoraFinal()) - 30*60);
        	#$hora_inicio_encaixe = date('H:i', strtotime($agenda->getHoraFinal()) - 30*60);
        	
            $hora_final_encaixe = $agenda->getHoraFinal();

            $codigo_encaixe = $agenda->getCodigo() . '-1';
            $sql = "(
                '{$agenda->getCodigo()}',   
                {$agenda->getIdMedico()},   
                {$agenda->getIdUnidade()},   
                '{$agenda->getData()}',   
                '{$agenda->getHoraInicio()}',   
                '{$hora_final_agenda}',   
                {$agenda->getIdEspecialidade()},   
                {$agenda->getAdicionadoPor()},   
                '{$today}',
                0
            ),
            (
                '{$codigo_encaixe}',   
                {$agenda->getIdMedico()},
                {$agenda->getIdUnidade()},   
                '{$agenda->getData()}',   
                '{$hora_inicio_encaixe}',   
                '{$agenda->getHoraFinal()}',   
                {$agenda->getIdEspecialidade()},   
                {$agenda->getAdicionadoPor()},   
                '{$today}',
                1
            )";
            return preg_replace('/\s/', '', $sql);
        })->join(',');
        elseif ($encaixe == false):
            $values = $agendas->map(function (AgendaMedico $agenda) use ($today) : string {
                $sql = "(
                '{$agenda->getCodigo()}',   
                {$agenda->getIdMedico()},  
                {$agenda->getIdUnidade()},   
                '{$agenda->getData()}',   
                '{$agenda->getHoraInicio()}',   
                '{$agenda->getHoraFinal()}',   
                {$agenda->getIdEspecialidade()},   
                {$agenda->getAdicionadoPor()},   
                '{$today}',
                0
            )";
                return preg_replace('/\s/', '', $sql);
            })->join(',');
        endif;
        $sql = str_replace('VALUES ()', "VALUES $values", $sql);

        log_message('error', json_encode( $sql ));

        $query = $this->db->query($sql);
        return $query->connID->affected_rows === $agendas->length || $query->connID->affected_rows === $agendas->length*2;
    }

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