<?php

namespace App\Models;

use App\Entities\CEP\CEP;
use App\Mappers\CEPMapper;
use CodeIgniter\Model;

class CEPModel extends ModelEntity {
	protected $table = 'cep';
	protected $primaryKey = 'id';
	protected $returnType = 'array';
	protected $allowedFields = [
			'cep',
			'bairro',
			'logradouro',
			'cidade',
			'estado' ];
	protected $useSoftDeletes = false;
	protected $skipValidation = true;

	public function getCep(string $cep_ref): ?CEP {
		$sql = ' SELECT id, cep, bairro, logradouro, cidade,  estado ';
		$sql .= ' FROM cep ';
		$sql .= ' WHERE cep = ? ';
		$sql .= ' LIMIT 1 ';
		$binds = [$cep_ref ];
		$query = $this->db->query( $sql, $binds );
		$result_array = $query->getResultArray();
		return $result_array ? CEPMapper::getCEPfromData( $result_array [0] ) : null;

	}

	public function registerCep(CEP $cep): void {
		$cep_data = $cep->toArray();
		unset( $cep_data ['id'] );
		$id_new_cep = $this->insert( $cep_data );
        $cep->setId($id_new_cep);
	}

	public function updateCepByPacienteID(int $id_paciente, CEP $cep): bool {

		$data = $cep->toArray( true );
		if (count( $data ) > 0) {
			$binds = [
					'id_paciente' => $id_paciente ];
			$sql = "
                UPDATE cep
                INNER JOIN endereco ON cep.id = endereco.cep
                INNER JOIN pessoa ON endereco.id = pessoa.id_endereco
                INNER JOIN paciente ON paciente.id_pessoa = pessoa.id
            ";
			$sql .= $this->generateUpdateSets( $data, $binds );
			$sql .= 'WHERE paciente.id = :id_paciente:';
			$query = $this->db->query( $sql, $binds );
			$errors = $this->errors();
			return ! $errors;
		} else {
			return true;
		}

	}

	public function updateCepByAssistenteID(int $id_assistente, CEP $cep): bool {

		$data = $cep->toArray( true );
		if (count( $data ) > 0) {
			$binds = [
					'id_assistente' => $id_assistente ];
			$sql = "
                UPDATE cep
                INNER JOIN endereco ON endereco.cep = cep.id
                INNER JOIN pessoa ON endereco.id = pessoa.id_endereco
                INNER JOIN profissional ON pessoa.id = profissional.id_pessoa
                INNER JOIN assistente ON profissional.id = assistente.id_profissional
            ";
			$sql .= $this->generateUpdateSets( $data, $binds );
			$sql .= 'WHERE assistente.id = :id_assistente:';

			$query = $this->db->query( $sql, $binds );
			$errors = $this->errors();
			return ! $errors;
		} else {
			return true;
		}

	}

	public function updateCepByRecepcionistaID(int $id_assistente, CEP $cep): bool {

		$data = $cep->toArray( true );
		if (count( $data ) > 0) {
			$binds = [
					'id_assistente' => $id_assistente ];
			$sql = "
                UPDATE cep
                INNER JOIN endereco ON endereco.cep = cep.id
                INNER JOIN pessoa ON endereco.id = pessoa.id_endereco
                INNER JOIN profissional ON pessoa.id = profissional.id_pessoa
                INNER JOIN assistente ON profissional.id = assistente.id_profissional
            ";
			$sql .= $this->generateUpdateSets( $data, $binds );
			$sql .= 'WHERE assistente.id = :id_assistente:';

			$query = $this->db->query( $sql, $binds );
			$errors = $this->errors();
			return ! $errors;
		} else {
			return true;
		}

	}

    public function updateCepByMedicoID(int $id_medico, CEP $cep): bool {
        $data = $cep->toArray( true );
        if (count( $data ) > 0) {
            $binds = [
                'id_medico' => $id_medico ];
            $sql = "
                UPDATE cep
                INNER JOIN endereco ON endereco.cep = cep.id
                INNER JOIN pessoa ON endereco.id = pessoa.id_endereco
                INNER JOIN profissional ON pessoa.id = profissional.id_pessoa
                INNER JOIN medico ON profissional.id = medico.id_profissional
            ";
            $sql .= $this->generateUpdateSets( $data, $binds );
            $sql .= 'WHERE medico.id = :id_medico:';

            $query = $this->db->query( $sql, $binds );
            $errors = $this->errors();
            return ! $errors;
        } else {
            return true;
        }

    }

    public function updateCepByAdministrativoID(int $id_administrativo, CEP $cep): bool {

        $data = $cep->toArray( true );
        if (count( $data ) > 0) {
            $binds = [
                'id_administrativo' => $id_administrativo ];
            $sql = "
                UPDATE cep
                INNER JOIN endereco ON endereco.cep = cep.id
                INNER JOIN pessoa ON endereco.id = pessoa.id_endereco
                INNER JOIN profissional ON pessoa.id = profissional.id_pessoa
                INNER JOIN administrativo ON profissional.id = administrativo.id_profissional
            ";
            $sql .= $this->generateUpdateSets( $data, $binds );
            $sql .= 'WHERE administrativo.id = :id_administrativo:';

            $query = $this->db->query( $sql, $binds );
            $errors = $this->errors();
            return ! $errors;
        } else {
            return true;
        }

    }

    public function updateCepByUnidadeID(int $id_pessoa_juridica, CEP $cep): bool {

        $data = $cep->toArray( true );
        if (count( $data ) > 0) {
            $binds = [
            		'id_pj' => $id_pessoa_juridica ];
            $sql = "
                UPDATE cep
                INNER JOIN endereco ON endereco.cep = cep.id
                INNER JOIN pessoa ON endereco.id = pessoa.id_endereco
                INNER JOIN pessoa_juridica ON pessoa.id = pessoa_juridica.id_pessoa
            ";
            $sql .= $this->generateUpdateSets( $data, $binds );
            $sql .= 'WHERE pessoa_juridica.id = :id_pj:';

            $query = $this->db->query( $sql, $binds );
            $errors = $this->errors();
            return ! $errors;
        } else {
            return true;
        }

    }

}
