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

class Proveedores extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('logistica/Proveedor_model');
    }

    protected function normalizarTexto($texto) {
        return strtoupper(trim($texto));
    }

    protected function validar_permiso_ajax_proveedor() {
        if (!tiene_permiso('proveedores_crear') && !tiene_permiso('proveedores_editar')) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'No tienes permisos para esta acción'
            ));
            exit;
        }
    }

    protected function validar_documento_por_tipo($documento_identidad_id, $nro_documento) {
        $doc = $this->db->where('id', $documento_identidad_id)->get('mt_documento_identidad')->row();

        if (!$doc) return 'Tipo de documento no válido';

        $abreviado = strtoupper(trim($doc->abreviado));
        $nro       = trim($nro_documento);

        if (in_array($abreviado, array('DNI', 'RUC'))) {
            if (!ctype_digit($nro)) {
                return 'El número de documento debe contener solo números';
            }
        }

        if ($abreviado === 'DNI' && strlen($nro) != 8) {
            return 'El DNI debe tener exactamente 8 dígitos';
        }

        if ($abreviado === 'RUC' && strlen($nro) != 11) {
            return 'El RUC debe tener exactamente 11 dígitos';
        }

        return true;
    }

    // ---------------------------------------------------------------
    // LISTADO
    // ---------------------------------------------------------------
    public function index() {
        $this->validar_permiso('proveedores_ver');

        $data['titulo']      = 'Proveedores';
        $data['proveedores'] = $this->Proveedor_model->listar();
        $this->layout('logistica/proveedores/index', $data);
    }

    // ---------------------------------------------------------------
    // FORMULARIO NUEVO
    // ---------------------------------------------------------------
    public function create() {
        $this->validar_permiso('proveedores_crear');

        $data['titulo']           = 'Nuevo Proveedor';
        $data['documentos']       = $this->Proveedor_model->listar_documentos();
        $data['monedas']          = $this->Proveedor_model->listar_monedas();
        $data['formas_pago']      = $this->Proveedor_model->listar_formas_pago();
        $data['sectores_negocio'] = $this->Proveedor_model->listar_sectores_negocio();
        $data['departamentos']    = $this->Proveedor_model->get_departamentos();

        $this->layout('logistica/proveedores/create', $data);
    }

    // ---------------------------------------------------------------
    // GUARDAR NUEVO
    // ---------------------------------------------------------------
    public function store() {
        $this->validar_permiso('proveedores_crear');

        $this->form_validation->set_rules('codigo',                 'Código',            'required|trim|max_length[10]');
        $this->form_validation->set_rules('razon_social',           'Razón social',      'required|trim|max_length[150]');
        $this->form_validation->set_rules('documento_identidad_id', 'Tipo documento',    'required');
        $this->form_validation->set_rules('nro_documento',          'Número documento',  'required|trim|max_length[20]');
        $this->form_validation->set_rules('contacto',               'Contacto',          'trim|max_length[60]');
        $this->form_validation->set_rules('contacto_cargo',         'Cargo contacto',    'trim|max_length[60]');
        $this->form_validation->set_rules('domicilio_fiscal',       'Domicilio fiscal',  'trim|max_length[255]');
        $this->form_validation->set_rules('telefono',               'Teléfono',          'trim|max_length[30]');
        $this->form_validation->set_rules('email',                  'Email',             'trim|valid_email|max_length[50]');
        $this->form_validation->set_rules('fp_descripcion',         'Desc. forma pago',  'trim|max_length[60]');

        if ($this->form_validation->run() == FALSE) {
            $this->create();
            return;
        }

        $codigo                 = strtoupper(trim($this->input->post('codigo', TRUE)));
        $razon_social           = $this->normalizarTexto($this->input->post('razon_social', TRUE));
        $documento_identidad_id = $this->input->post('documento_identidad_id', TRUE);
        $nro_documento          = trim($this->input->post('nro_documento', TRUE));

        if ($this->Proveedor_model->existe_codigo($codigo)) {
            $this->session->set_flashdata('error', 'El código del proveedor ya existe');
            redirect('logistica/proveedores/create');
        }

        if ($this->Proveedor_model->existe_documento($nro_documento)) {
            $this->session->set_flashdata('error', 'El número de documento ya existe');
            redirect('logistica/proveedores/create');
        }

        $validacion_documento = $this->validar_documento_por_tipo($documento_identidad_id, $nro_documento);
        if ($validacion_documento !== true) {
            $this->session->set_flashdata('error', $validacion_documento);
            redirect('logistica/proveedores/create');
        }

        $data = array(
            'codigo'                 => $codigo,
            'razon_social'           => $razon_social,
            'documento_identidad_id' => $documento_identidad_id,
            'nro_documento'          => $nro_documento,
            'contacto'               => $this->normalizarTexto($this->input->post('contacto', TRUE)),
            'contacto_cargo'         => $this->normalizarTexto($this->input->post('contacto_cargo', TRUE)),
            'domicilio_fiscal'       => trim($this->input->post('domicilio_fiscal', TRUE)),
            'ubigeo_id'              => $this->input->post('ubigeo_id', TRUE) ?: null,
            'telefono'               => trim($this->input->post('telefono', TRUE)),
            'email'                  => trim($this->input->post('email', TRUE)),
            'obs'                    => trim($this->input->post('obs', TRUE)),
            'fp_id'                  => $this->input->post('fp_id', TRUE) ?: null,
            'fp_descripcion'         => trim($this->input->post('fp_descripcion', TRUE)),
            'moneda_id'              => $this->input->post('moneda_id', TRUE) ?: null,
            'sn_id'                  => $this->input->post('sn_id', TRUE) ?: null,
            'estado'                 => 1,
            'created_by'             => $this->session->userdata('id')
        );

        if ($this->Proveedor_model->insertar($data)) {
            $this->session->set_flashdata('success', 'Proveedor registrado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo registrar el proveedor');
        }

        redirect('logistica/proveedores');
    }

    // ---------------------------------------------------------------
    // FORMULARIO EDITAR
    // ---------------------------------------------------------------
    public function edit($id) {
        $this->validar_permiso('proveedores_editar');

        $proveedor = $this->Proveedor_model->obtener($id);
        if (!$proveedor) show_404();

        $ubigeo = null;
        if (!empty($proveedor->ubigeo_id)) {
            $ubigeo = $this->Proveedor_model->get_ubigeo_by_id($proveedor->ubigeo_id);
        }

        $data['titulo']           = 'Editar Proveedor';
        $data['proveedor']        = $proveedor;
        $data['documentos']       = $this->Proveedor_model->listar_documentos();
        $data['monedas']          = $this->Proveedor_model->listar_monedas();
        $data['formas_pago']      = $this->Proveedor_model->listar_formas_pago();
        $data['sectores_negocio'] = $this->Proveedor_model->listar_sectores_negocio();
        $data['departamentos']    = $this->Proveedor_model->get_departamentos();
        $data['ubigeo_actual']    = $ubigeo;

        if ($ubigeo) {
            $data['provincias'] = $this->Proveedor_model->get_provincias($ubigeo->departamento);
            $data['distritos']  = $this->Proveedor_model->get_distritos($ubigeo->departamento, $ubigeo->provincia);
        } else {
            $data['provincias'] = array();
            $data['distritos']  = array();
        }

        $this->layout('logistica/proveedores/edit', $data);
    }

    // ---------------------------------------------------------------
    // ACTUALIZAR
    // ---------------------------------------------------------------
    public function update($id) {
        $this->validar_permiso('proveedores_editar');

        $proveedor = $this->Proveedor_model->obtener($id);
        if (!$proveedor) show_404();

        $this->form_validation->set_rules('codigo',                 'Código',            'required|trim|max_length[10]');
        $this->form_validation->set_rules('razon_social',           'Razón social',      'required|trim|max_length[150]');
        $this->form_validation->set_rules('documento_identidad_id', 'Tipo documento',    'required');
        $this->form_validation->set_rules('nro_documento',          'Número documento',  'required|trim|max_length[20]');
        $this->form_validation->set_rules('contacto',               'Contacto',          'trim|max_length[60]');
        $this->form_validation->set_rules('contacto_cargo',         'Cargo contacto',    'trim|max_length[60]');
        $this->form_validation->set_rules('domicilio_fiscal',       'Domicilio fiscal',  'trim|max_length[255]');
        $this->form_validation->set_rules('telefono',               'Teléfono',          'trim|max_length[30]');
        $this->form_validation->set_rules('email',                  'Email',             'trim|valid_email|max_length[50]');
        $this->form_validation->set_rules('fp_descripcion',         'Desc. forma pago',  'trim|max_length[60]');

        if ($this->form_validation->run() == FALSE) {
            $this->edit($id);
            return;
        }

        $codigo                 = strtoupper(trim($this->input->post('codigo', TRUE)));
        $razon_social           = $this->normalizarTexto($this->input->post('razon_social', TRUE));
        $documento_identidad_id = $this->input->post('documento_identidad_id', TRUE);
        $nro_documento          = trim($this->input->post('nro_documento', TRUE));

        if ($this->Proveedor_model->existe_codigo($codigo, $id)) {
            $this->session->set_flashdata('error', 'El código del proveedor ya existe');
            redirect('logistica/proveedores/edit/' . $id);
        }

        if ($this->Proveedor_model->existe_documento($nro_documento, $id)) {
            $this->session->set_flashdata('error', 'El número de documento ya existe');
            redirect('logistica/proveedores/edit/' . $id);
        }

        $validacion_documento = $this->validar_documento_por_tipo($documento_identidad_id, $nro_documento);
        if ($validacion_documento !== true) {
            $this->session->set_flashdata('error', $validacion_documento);
            redirect('logistica/proveedores/edit/' . $id);
        }

        $data = array(
            'codigo'                 => $codigo,
            'razon_social'           => $razon_social,
            'documento_identidad_id' => $documento_identidad_id,
            'nro_documento'          => $nro_documento,
            'contacto'               => $this->normalizarTexto($this->input->post('contacto', TRUE)),
            'contacto_cargo'         => $this->normalizarTexto($this->input->post('contacto_cargo', TRUE)),
            'domicilio_fiscal'       => trim($this->input->post('domicilio_fiscal', TRUE)),
            'ubigeo_id'              => $this->input->post('ubigeo_id', TRUE) ?: null,
            'telefono'               => trim($this->input->post('telefono', TRUE)),
            'email'                  => trim($this->input->post('email', TRUE)),
            'obs'                    => trim($this->input->post('obs', TRUE)),
            'fp_id'                  => $this->input->post('fp_id', TRUE) ?: null,
            'fp_descripcion'         => trim($this->input->post('fp_descripcion', TRUE)),
            'moneda_id'              => $this->input->post('moneda_id', TRUE) ?: null,
            'sn_id'                  => $this->input->post('sn_id', TRUE) ?: null,
            'updated_at'             => date('Y-m-d H:i:s'),
            'updated_by'             => $this->session->userdata('id')
        );

        if ($this->Proveedor_model->actualizar($id, $data)) {
            $this->session->set_flashdata('success', 'Proveedor actualizado correctamente');
        } else {
            $this->session->set_flashdata('error', 'No se pudo actualizar el proveedor');
        }

        redirect('logistica/proveedores');
    }

    // ---------------------------------------------------------------
    // VER DETALLE
    // ---------------------------------------------------------------
    public function ver($id) {
        $this->validar_permiso('proveedores_ver');

        $proveedor = $this->db
            ->select('
                p.*,
                td.nombre as tipo_documento,
                td.abreviado as documento_abreviado,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado,
                fp.nombre as forma_pago,
                sn.nombre as sector_negocio,
                u.nombre as distrito_nombre,
                u.departamento as ub_departamento,
                u.provincia as ub_provincia
            ')
            ->from('lt_proveedor p')
            ->join('mt_documento_identidad td', 'td.id = p.documento_identidad_id')
            ->join('mt_moneda m', 'm.id = p.moneda_id', 'left')
            ->join('mt_forma_pago fp', 'fp.id = p.fp_id', 'left')
            ->join('mt_sector_negocio sn', 'sn.id = p.sn_id', 'left')
            ->join('mt_ubigeo u', 'u.id = p.ubigeo_id', 'left')
            ->where('p.id', $id)
            ->get()
            ->row();

        if (!$proveedor) show_404();

        $departamento = null;
        $provincia    = null;

        if (!empty($proveedor->ub_departamento)) {
            $departamento = $this->db
                ->select('nombre')
                ->from('mt_ubigeo')
                ->where('departamento', $proveedor->ub_departamento)
                ->where('provincia', '00')
                ->where('distrito', '00')
                ->where('estado', 1)
                ->get()->row();
        }

        if (!empty($proveedor->ub_departamento) && !empty($proveedor->ub_provincia)) {
            $provincia = $this->db
                ->select('nombre')
                ->from('mt_ubigeo')
                ->where('departamento', $proveedor->ub_departamento)
                ->where('provincia', $proveedor->ub_provincia)
                ->where('distrito', '00')
                ->where('estado', 1)
                ->get()->row();
        }

        $proveedor->departamento_nombre = $departamento ? $departamento->nombre : '';
        $proveedor->provincia_nombre    = $provincia    ? $provincia->nombre    : '';

        $data['titulo']    = 'Detalle de Proveedor';
        $data['proveedor'] = $proveedor;

        $this->layout('logistica/proveedores/ver', $data);
    }

    // ---------------------------------------------------------------
    // CAMBIAR ESTADO
    // ---------------------------------------------------------------
    public function estado($id) {
        $this->validar_permiso('proveedores_eliminar');

        $proveedor = $this->Proveedor_model->obtener($id);
        if (!$proveedor) show_404();

        $nuevoEstado = ($proveedor->estado == 1) ? 0 : 1;

        if ($this->Proveedor_model->cambiarEstado($id, $nuevoEstado, $this->session->userdata('id'))) {
            $mensaje = ($nuevoEstado == 1) ? 'Proveedor activado correctamente' : 'Proveedor desactivado correctamente';
            $this->session->set_flashdata('success', $mensaje);
        } else {
            $this->session->set_flashdata('error', 'No se pudo cambiar el estado del proveedor');
        }

        redirect('logistica/proveedores');
    }

    // ---------------------------------------------------------------
    // AJAX - UBIGEO
    // ---------------------------------------------------------------
    public function provincias_ajax() {
        $this->validar_permiso_ajax_proveedor();
        $departamento = $this->input->post('departamento', TRUE);
        echo json_encode($this->Proveedor_model->get_provincias($departamento));
    }

    public function distritos_ajax() {
        $this->validar_permiso_ajax_proveedor();
        $departamento = $this->input->post('departamento', TRUE);
        $provincia    = $this->input->post('provincia', TRUE);
        echo json_encode($this->Proveedor_model->get_distritos($departamento, $provincia));
    }

    // ---------------------------------------------------------------
    // AJAX - CONSULTA RUC/DNI (autocompletado)
    // ---------------------------------------------------------------
    /**
     * Consulta RUC u DNI en la API externa (apis.net.pe / decolecta)
     * y devuelve los datos para autocompletar el formulario de proveedor.
     * Se invoca desde JS al completar 8 (DNI) u 11 (RUC) dígitos.
     */
    public function consultar_documento_ajax() {
        $this->validar_permiso_ajax_proveedor();

        $numero = trim($this->input->post('numero', TRUE));

        if (!ctype_digit($numero) || !in_array(strlen($numero), array(8, 11))) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'Número de documento inválido'
            ));
            return;
        }

        $token = $this->Proveedor_model->get_token_api_consulta();

        if (empty($token)) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'No hay un token de API de consulta configurado para la empresa'
            ));
            return;
        }

        $es_ruc = (strlen($numero) === 11);

        $url = $es_ruc
            ? 'https://api.decolecta.com/v1/sunat/ruc?numero=' . $numero
            : 'https://api.decolecta.com/v1/reniec/dni?numero=' . $numero;

        $referer = $es_ruc
            ? 'http://apis.net.pe/api-ruc'
            : 'https://apis.net.pe/consulta-dni-api';

        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 15,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_CUSTOMREQUEST => 'GET',
            CURLOPT_HTTPHEADER => array(
                'Referer: ' . $referer,
                'Authorization: Bearer ' . $token
            ),
        ));

        $response   = curl_exec($curl);
        $http_code  = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        $curl_error = curl_error($curl);
        curl_close($curl);

        if ($curl_error) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'Error de conexión con el servicio de consulta'
            ));
            return;
        }

        if ($http_code === 404) {
            echo json_encode(array(
                'status'  => false,
                'message' => $es_ruc ? 'RUC no encontrado' : 'DNI no encontrado'
            ));
            return;
        }

        if ($http_code === 422) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'El número de documento no pasó la validación del servicio'
            ));
            return;
        }

        if ($http_code !== 200) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'El servicio de consulta no respondió correctamente'
            ));
            return;
        }

        $data = json_decode($response);

        if (!$data) {
            echo json_encode(array(
                'status'  => false,
                'message' => 'Respuesta inválida del servicio de consulta'
            ));
            return;
        }

        if ($es_ruc) {
            $resultado = array(
                'status'       => true,
                'razon_social' => isset($data->razon_social) ? $data->razon_social : '',
                'direccion'    => (isset($data->direccion) && $data->direccion !== '-') ? trim($data->direccion) : '',
                'ubigeo'       => (isset($data->ubigeo) && $data->ubigeo !== '-') ? $data->ubigeo : ''
            );
        } else {
            $resultado = array(
                'status'       => true,
                'razon_social' => isset($data->full_name) ? $data->full_name : '',
                'direccion'    => '',
                'ubigeo'       => ''
            );
        }

        // Autoseleccionar tipo de documento (DNI/RUC) según la longitud consultada
        $doc_row = $this->Proveedor_model->get_documento_identidad_by_abreviado($es_ruc ? 'RUC' : 'DNI');
        if ($doc_row) {
            $resultado['documento_identidad_id'] = $doc_row->id;
        }

        // Si hay ubigeo de 6 dígitos, lo partimos y buscamos el id interno
        if (!empty($resultado['ubigeo']) && strlen($resultado['ubigeo']) === 6) {
            $cod_dep  = substr($resultado['ubigeo'], 0, 2);
            $cod_prov = substr($resultado['ubigeo'], 2, 2);
            $cod_dist = substr($resultado['ubigeo'], 4, 2);

            $ubigeo_row = $this->Proveedor_model->get_ubigeo_by_codigo($cod_dep, $cod_prov, $cod_dist);

            if ($ubigeo_row) {
                $resultado['ubigeo_id']           = $ubigeo_row->id;
                $resultado['departamento_codigo'] = $cod_dep;
                $resultado['provincia_codigo']    = $cod_prov;
            }
        }

        echo json_encode($resultado);
    }
}