<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Cliente_model extends CI_Model {

    public function listar() {
        $clientes = $this->db
            ->select('
                c.*,
                td.abreviado as tipdoc_abreviado,
                td.nombre as tipo_documento,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado,
                fp.nombre as forma_pago,
                v.apellidos,
                v.nombres,
                u.nombre as distrito_nombre,
                u.departamento as ub_departamento,
                u.provincia as ub_provincia
            ')
            ->from('vt_cliente c')
            ->join('mt_documento_identidad td', 'td.id = c.documento_identidad_id')
            ->join('mt_moneda m', 'm.id = c.moneda_id')
            ->join('mt_forma_pago fp', 'fp.id = c.fp_id', 'left')
            ->join('rh_empleado v', 'v.id = c.vendedor_id', 'left')
            ->join('mt_ubigeo u', 'u.id = c.ubigeo_id', 'left')
            ->order_by('c.id', 'DESC')
            ->get()
            ->result();

        foreach ($clientes as $item) {
            $item->vendedor = trim(($item->apellidos ?? '') . ' ' . ($item->nombres ?? ''));
        }

        return $clientes;
    }

    public function obtener($id) {
        return $this->db->where('id', $id)->get('vt_cliente')->row();
    }

    public function insertar($data) {
        return $this->db->insert('vt_cliente', $data);
    }

    public function actualizar($id, $data) {
        return $this->db->where('id', $id)->update('vt_cliente', $data);
    }

    public function cambiarEstado($id, $estado, $usuario_id = null) {
        return $this->db->where('id', $id)->update('vt_cliente', array(
            'estado' => $estado,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $usuario_id
        ));
    }

    public function existe_codigo($codigo, $id = null) {
        $this->db->where('codigo', $codigo);
        if ($id !== null) $this->db->where('id !=', $id);
        return $this->db->get('vt_cliente')->num_rows() > 0;
    }

    public function existe_documento($nro_documento, $id = null) {
        $this->db->where('nro_documento', $nro_documento);
        if ($id !== null) $this->db->where('id !=', $id);
        return $this->db->get('vt_cliente')->num_rows() > 0;
    }

    public function listar_documentos() {
        return $this->db->where('estado', 1)->order_by('nombre', 'ASC')->get('mt_documento_identidad')->result();
    }

    public function listar_monedas() {
        return $this->db->where('estado', 1)->order_by('nombre', 'ASC')->get('mt_moneda')->result();
    }

    public function listar_formas_pago() {
        return $this->db->where('estado', 1)->order_by('nombre', 'ASC')->get('mt_forma_pago')->result();
    }

    public function listar_vendedores() {
        return $this->db
            ->select('id, apellidos, nombres')
            ->where('estado', 1)
            ->order_by('apellidos', 'ASC')
            ->get('rh_empleado')
            ->result();
    }

    public function get_departamentos() {
        return $this->db
            ->select('id, departamento as codigo, nombre')
            ->from('mt_ubigeo')
            ->where('provincia', '00')
            ->where('distrito', '00')
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get()
            ->result();
    }

    public function get_provincias($departamento) {
        return $this->db
            ->select('id, provincia as codigo, nombre')
            ->from('mt_ubigeo')
            ->where('departamento', $departamento)
            ->where('provincia !=', '00')
            ->where('distrito', '00')
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get()
            ->result();
    }

    public function get_distritos($departamento, $provincia) {
        return $this->db
            ->select('id, distrito as codigo, nombre')
            ->from('mt_ubigeo')
            ->where('departamento', $departamento)
            ->where('provincia', $provincia)
            ->where('distrito !=', '00')
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get()
            ->result();
    }

    public function get_ubigeo_by_id($id) {
        return $this->db->where('id', $id)->get('mt_ubigeo')->row();
    }

    /**
     * Obtiene el token de la API de consulta RUC/DNI configurado
     * para la empresa activa (tabla empresa, columna api_consulta_token).
     */
    public function get_token_api_consulta() {
        $empresa = $this->db
            ->select('api_consulta_token')
            ->where('estado', 1)
            ->get('empresa')
            ->row();

        return $empresa ? $empresa->api_consulta_token : null;
    }

    /**
     * Busca el registro de ubigeo a partir del código de 6 dígitos
     * que devuelve la API (ej. "150131" = departamento 15, provincia 01, distrito 31).
     */
    public function get_ubigeo_by_codigo($departamento, $provincia, $distrito) {
        return $this->db
            ->where('departamento', $departamento)
            ->where('provincia', $provincia)
            ->where('distrito', $distrito)
            ->where('estado', 1)
            ->get('mt_ubigeo')
            ->row();
    }

    /**
     * Busca el registro de mt_documento_identidad a partir de su abreviado
     * (DNI / RUC), para autoseleccionar el combo de tipo de documento
     * cuando se autocompleta vía consulta de documento.
     */
    public function get_documento_identidad_by_abreviado($abreviado) {
        return $this->db
            ->where('abreviado', $abreviado)
            ->where('estado', 1)
            ->get('mt_documento_identidad')
            ->row();
    }
}