<?php


namespace App\Models;

use App\Entities\Pessoa\Pessoa;
use App\Entities\PessoaFisica\PessoaFisica;
use CodeIgniter\Model;

class PessoaFisicaModel extends ModelEntity {
	protected $table = 'pessoa_fisica';
	protected $primaryKey = 'id';
	protected $returnType = 'array';
	protected $allowedFields = [ 
			'id_pessoa',
			'cpf',
			'rg',
			'genero',
			'data_nascimento',
			'nome',
			'profissao',
			'estado_civil'
	];
	protected $useSoftDeletes = false;
	protected $skipValidation = true;
	protected $useTimestamps = false;

	public function registerPessoaFisica(PessoaFisica &$pessoaFisica): void {

		$data = $pessoaFisica->toArray();
		unset( $data ['id'] );
		$id_new_pessoa_fisica = $this->insert( $data );
		$pessoaFisica->setId( $id_new_pessoa_fisica );

	}

	public function updatePessoaFisicaByPacienteID(int $id_paciente, PessoaFisica $pessoa_fisica): bool {

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

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

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

	}

	public function updatePessoaFisicaByMedicoID(int $id_medico, PessoaFisica $pessoa_fisica): bool {

		$data = $pessoa_fisica->toArray( true );
		if (count( $data ) > 0) {
			$binds = [ 
					'id_medico' => $id_medico
			];
			$sql = "
                update pessoa_fisica
                inner join pessoa on pessoa.id = pessoa_fisica.id_pessoa
                inner join profissional on profissional.id_pessoa = pessoa.id
                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 updatePessoaFisicaByUsuarioID(int $id_usuario, PessoaFisica $pessoa_fisica): bool {

		$data = $pessoa_fisica->toArray( true );
		$status = true;
		if (count( $data ) > 0) {
			$binds = [ 
					'id_usuario' => $id_usuario
			];
			$sql = "
                update pessoa_fisica
                inner join pessoa on pessoa.id = pessoa_fisica.id_pessoa
                inner join usuario on pessoa.id = usuario.id_pessoa
            ";
			$sql .= $this->generateUpdateSets( $data, $binds );
			$sql .= 'WHERE usuario.id = :id_usuario:';
			$query = $this->db->query( $sql, $binds );
			$errors = $this->errors();
			$status = !$errors;
		}
		return $status;

	}

}
