<?php namespace App\Models;

use App\Entities\Perfil\Perfil;
use App\Entities\Usuario\Usuario;
use CodeIgniter\Model;

class UsuarioModel extends ModelEntity
{
    protected $table = 'usuario';
    protected $primaryKey = 'id';
    protected $returnType = 'array';
    protected $allowedFields = [
        'email',
        'senha',
        'ativo',
        'foto',
        'email_verificado_em',
        'id_pessoa',
        'adicionado_por',
        'alterado_por',
        'senha_chamefacil',
    ];
    protected $useSoftDeletes = false;
    protected $useTimestamps = true;
    protected $skipValidation = true;
    protected $createdField  = 'criado_em';
    protected $updatedField  = 'alterado_em';

    public function registerUsuario(Usuario &$usuario) : void {
        $usuario_data = $usuario->toArray();
        unset($usuario_data['id']);
        unset($usuario_data['criado_em']);
        unset($usuario_data['alterado_em']);
        $id_new_usuario = $this->insert($usuario_data);
        $usuario->setId($id_new_usuario);
    }

    public function updateUsuarioID (int $id_paciente, array $usuario) : bool {
//        $data = $usuario->toArray(true);
        if (count($usuario) > 0) {
            $binds = ['id_paciente' => $id_paciente];
            $sql = "
                update usuario
            ";
            $sql .= $this->generateUpdateSets($usuario, $binds);
            $sql .= 'WHERE id = :id_paciente:';
            $query = $this->db->query($sql, $binds);
            $errors = $this->errors();
            return !$errors;
        } else {
            return true;
        }
    }

    public function updateUsuarioByPacienteID (int $id_paciente, Usuario $usuario) : bool {
        $data = $usuario->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_paciente' => $id_paciente];
            $sql = "
                update usuario
                inner join pessoa on pessoa.id = usuario.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 updateUsuarioByAssistenteID (int $id_assistente, Usuario $usuario) : bool {
        $data = $usuario->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_assistente' => $id_assistente];
            $sql = "
                update usuario
                inner join pessoa on pessoa.id = usuario.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 updateUsuarioByAdministrativoID (int $id_administrativo, Usuario $usuario) : bool {
        $data = $usuario->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_administrativo' => $id_administrativo];
            $sql = "
                update usuario
                inner join pessoa on pessoa.id = usuario.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 updateUsuarioByMedicoID (int $id_medico, Usuario $usuario) : bool {
        $data = $usuario->toArray(true);
        if (count($data) > 0) {
            $binds = ['id_medico' => $id_medico];
            $sql = "
                update usuario
                inner join pessoa on pessoa.id = usuario.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 updateIdChameFacilByUsuarioID (int $id_usuario, int $id_chamefacil) {
        $sql = "
                UPDATE usuario
                SET id_chamefacil=$id_chamefacil
                WHERE id=$id_usuario;
            ";
        $query = $this->db->query($sql);
        return $query->affected_rows;
    }
}
