<?php


namespace App\Models;

use App\Entities\Paciente\Paciente;
use App\Services\PacienteService;
use App\Services\PessoaService;
use App\Services\Service;
use App\Utils\ModelUtils;
use App\ViewModels\Paciente\PacienteRegistrationViewModel\PacienteRegistrationViewModel;
use CodeIgniter\Model;


class PacienteModel extends ModelEntity {
	protected $table = 'paciente';
	protected $primaryKey = 'id';
	protected $returnType = 'array';
	protected $allowedFields = [ 
			'id_pessoa',
			'convenio',
			'adicionado_por',
			'alterado_por',
			'indicado_por',
			'peso',
			'altura'
	];
	protected $useSoftDeletes = false;
	protected $skipValidation = true;
	protected $useTimestamps = true;
	protected $createdField = 'criado_em';
	protected $updatedField = 'alterado_em';

	public function registerPaciente(Paciente &$paciente): void {

		$paciente_data = $paciente->toArray();
		unset( $paciente_data ['id'] );
		unset( $paciente_data ['criado_em'] );
		unset( $paciente_data ['alterado_em'] );
		$id_new_paciente = $this->insert( $paciente_data );
		$paciente->setId( $id_new_paciente );

	}

	public function updatePacienteByID(int $id_paciente, Paciente $paciente): bool {

		$data = $paciente->toArray( true );
		if (count( $data ) > 0) {
			$binds = [ 
					'id_paciente' => $id_paciente
			];
			$sql = "UPDATE paciente ";
			$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 updatePacienteByAssistenteID(int $id_assistente, Paciente $paciente): bool {

		$data = $paciente->toArray( true );
		if (count( $data ) > 0) {
			$binds = [ 
					'id_assistente' => $id_assistente
			];
			$sql = "
                update paciente
                inner join pessoa on pessoa.id = paciente.id_pessoa
                inner join profissional on profissional.id_pessoa = pessoa.id
                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 updatePacienteByAdministrativoID(int $id_administrativo, Paciente $paciente): bool {

		$data = $paciente->toArray( true );
		if (count( $data ) > 0) {
			$binds = [ 
					'id_administrativo' => $id_administrativo
			];
			$sql = "
                update paciente
                inner join pessoa on pessoa.id = paciente.id_pessoa
                inner join profissional on profissional.id_pessoa = pessoa.id
                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;
		}

	}

}
