<?php namespace App\Models;

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

class PessoaModel extends ModelEntity
{
    protected $table = 'pessoa';
    protected $primaryKey = 'id';
    protected $returnType = 'array';
    protected $allowedFields = [
        'telefone_1',
        'telefone_2',
        'telefone_3',
        'id_endereco',
        'id_tipo_pessoa',
        'adicionado_por',
        'alterado_por',
        'observacao',
    ];
    protected $useSoftDeletes = false;
    protected $skipValidation = true;
    protected $useTimestamps = true;
    protected $createdField  = 'criado_em';
    protected $updatedField  = 'alterado_em';

    public function registerPessoa (Pessoa &$pessoa) : void {
        $pessoa_data = $pessoa->toArray();
        unset($pessoa_data['id']);
        unset($pessoa_data['criado_em']);
        unset($pessoa_data['alterado_em']);
        $id_new_pessoa = $this->insert($pessoa_data);
        $pessoa->setId($id_new_pessoa);
    }

    public function updatePessoaByPacienteID (int $id_paciente, Pessoa $pessoa) : bool {
        $data = $pessoa->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_paciente' => $id_paciente];
            $sql = "
                UPDATE 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 updatePessoaByAssistenteID (int $id_assistente, Pessoa $pessoa) : bool {
        $data = $pessoa->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_assistente' => $id_assistente];
            $sql = "
                UPDATE 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 updatePessoaByAdministrativoID (int $id_administrativo, Pessoa $pessoa) : bool {
        $data = $pessoa->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_administrativo' => $id_administrativo];
            $sql = "
                UPDATE 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 updatePessoaByMedicoID (int $id_medico, Pessoa $pessoa) : bool {
        $data = $pessoa->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_medico' => $id_medico];
            $sql = "
                UPDATE 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 updatePessoaByUnidadeID (int $id_pessoa_juridica, Pessoa $pessoa) : bool {
        $data = $pessoa->toArray(true);
        if (count($data) > 0) {
        	
        	$binds = ['id_pj' => $id_pessoa_juridica];
            $sql = "
                UPDATE pessoa
                INNER JOIN pessoa_juridica ON pessoa_juridica.id_pessoa = pessoa.id
            ";
            $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;
        }
    }

    public function updatePessoaByUsuarioID (int $id_usuario, Pessoa $pessoa) : bool {
        $data = $pessoa->toArray(true);
        $status = true;
        if (count($data) > 0) {
            $binds = ['id_usuario' => $id_usuario];
            $sql = "
                UPDATE 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;
    }

}
