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

class Comisiones extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('finanzas/Comisiones_model');
        $this->load->model('configuracion/Empresa_model');
        $this->load->helper('numero');
    }

    // -------------------------------------------------------
    // INDEX — resumen de todos los vendedores en el período actual
    // -------------------------------------------------------
    public function index() {
        $this->validar_permiso('comisiones_ver');

        $config  = $this->Comisiones_model->obtener_config_empresa();
        $periodo = $this->Comisiones_model->calcular_periodo($config->comision_periodo);

        // Permitir filtrar por fechas custom (avance parcial)
        $desde = $this->input->get('desde') ?: $periodo['desde'];
        $hasta = $this->input->get('hasta') ?: $periodo['hasta'];

        $data['config']     = $config;
        $data['periodo']    = $periodo;
        $data['desde']      = $desde;
        $data['hasta']      = $hasta;
        $data['vendedores'] = $this->Comisiones_model->resumen_todos_vendedores($desde, $hasta);

        $this->layout('finanzas/comisiones/index', $data);
    }

    // -------------------------------------------------------
    // VER — detalle de un vendedor en el período
    // -------------------------------------------------------
    public function ver($vendedor_id) {
        $this->validar_permiso('comisiones_ver');

        $config   = $this->Comisiones_model->obtener_config_empresa();
        $vendedor = $this->Comisiones_model->obtener_vendedor($vendedor_id);
        if (!$vendedor) show_404();

        $periodo = $this->Comisiones_model->calcular_periodo($config->comision_periodo);
        $desde   = $this->input->get('desde') ?: $periodo['desde'];
        $hasta   = $this->input->get('hasta') ?: $periodo['hasta'];

        $resumen = $this->Comisiones_model->resumen_vendedor($vendedor_id, $desde, $hasta);
        $bono    = $this->Comisiones_model->calcular_bono(
            $vendedor_id,
            (float)$resumen->total_abonado,
            (float)$vendedor->comision_cuota
        );

        $pct_cumplimiento = $vendedor->comision_cuota > 0
            ? round(((float)$resumen->total_abonado / (float)$vendedor->comision_cuota) * 100, 2)
            : 0;

        $data['config']           = $config;
        $data['vendedor']         = $vendedor;
        $data['periodo']          = $periodo;
        $data['desde']            = $desde;
        $data['hasta']            = $hasta;
        $data['resumen']          = $resumen;
        $data['bono']             = $bono;
        $data['pct_cumplimiento'] = $pct_cumplimiento;
        $data['tramos']           = $this->Comisiones_model->listar_tramos($vendedor_id);
        $data['detalle']          = $this->Comisiones_model->reporte_detalle($vendedor_id, $desde, $hasta);

        $this->layout('finanzas/comisiones/ver', $data);
    }

    // -------------------------------------------------------
    // TRAMOS — configurar tramos de bono de un vendedor
    // -------------------------------------------------------
    public function tramos($vendedor_id) {
        $this->validar_permiso('comisiones_tramos');

        $vendedor = $this->Comisiones_model->obtener_vendedor($vendedor_id);
        if (!$vendedor) show_404();

        $data['vendedor'] = $vendedor;
        $data['tramos']   = $this->Comisiones_model->listar_tramos($vendedor_id);
        $this->layout('finanzas/comisiones/tramos', $data);
    }

    // -------------------------------------------------------
    // STORE TRAMO (AJAX)
    // -------------------------------------------------------
    public function store_tramo() {
        $this->validar_permiso('comisiones_tramos');

        if (!$this->input->is_ajax_request()) show_404();

        $vendedor_id = (int)$this->input->post('vendedor_id', TRUE);
        $desde_pct   = (float)$this->input->post('desde_pct', TRUE);
        $bono        = (float)$this->input->post('bono', TRUE);

        if (!$vendedor_id || $desde_pct <= 0 || $bono <= 0) {
            echo json_encode(['status' => false, 'msg' => 'Datos incompletos.']);
            return;
        }

        $this->Comisiones_model->insertar_tramo([
            'vendedor_id' => $vendedor_id,
            'desde_pct'   => $desde_pct,
            'bono'        => $bono,
            'created_by'  => $this->session->userdata('id'),
            'created_at'  => date('Y-m-d H:i:s'),
        ]);

        echo json_encode(['status' => true, 'msg' => 'Tramo guardado correctamente.']);
    }

    // -------------------------------------------------------
    // DELETE TRAMO (AJAX)
    // -------------------------------------------------------
    public function delete_tramo() {
        $this->validar_permiso('comisiones_tramos');

        if (!$this->input->is_ajax_request()) show_404();

        $id = (int)$this->input->post('id', TRUE);
        $this->Comisiones_model->eliminar_tramo($id);

        echo json_encode(['status' => true, 'msg' => 'Tramo eliminado.']);
    }

    // -------------------------------------------------------
    // STORE CUOTA VENDEDOR (AJAX)
    // -------------------------------------------------------
    public function store_cuota() {
        $this->validar_permiso('comisiones_tramos');

        if (!$this->input->is_ajax_request()) show_404();

        $vendedor_id = (int)$this->input->post('vendedor_id', TRUE);
        $cuota       = (float)$this->input->post('cuota', TRUE);

        if (!$vendedor_id || $cuota <= 0) {
            echo json_encode(['status' => false, 'msg' => 'Datos incompletos.']);
            return;
        }

        $this->Comisiones_model->actualizar_cuota_vendedor($vendedor_id, $cuota);
        echo json_encode(['status' => true, 'msg' => 'Cuota actualizada correctamente.']);
    }

    // -------------------------------------------------------
    // REPORTE PRINT — por vendedor
    // -------------------------------------------------------
    public function reporte($vendedor_id) {
        $this->validar_permiso('comisiones_reporte');

        $config   = $this->Comisiones_model->obtener_config_empresa();
        $vendedor = $this->Comisiones_model->obtener_vendedor($vendedor_id);
        if (!$vendedor) show_404();

        $periodo = $this->Comisiones_model->calcular_periodo($config->comision_periodo);
        $desde   = $this->input->get('desde') ?: $periodo['desde'];
        $hasta   = $this->input->get('hasta') ?: $periodo['hasta'];

        $resumen = $this->Comisiones_model->resumen_vendedor($vendedor_id, $desde, $hasta);
        $bono    = $this->Comisiones_model->calcular_bono(
            $vendedor_id,
            (float)$resumen->total_abonado,
            (float)$vendedor->comision_cuota
        );

        $pct_cumplimiento = $vendedor->comision_cuota > 0
            ? round(((float)$resumen->total_abonado / (float)$vendedor->comision_cuota) * 100, 2)
            : 0;

        $data['config']           = $config;
        $data['vendedor']         = $vendedor;
        $data['desde']            = $desde;
        $data['hasta']            = $hasta;
        $data['resumen']          = $resumen;
        $data['bono']             = $bono;
        $data['pct_cumplimiento'] = $pct_cumplimiento;
        $data['tramos']           = $this->Comisiones_model->listar_tramos($vendedor_id);
        $data['detalle']          = $this->Comisiones_model->reporte_detalle($vendedor_id, $desde, $hasta);
        $data['empresa']          = $this->Empresa_model->obtener();

        $this->load->view('finanzas/comisiones/reporte', $data);
    }

    // -------------------------------------------------------
    // HOOK — llamar desde Cobranzas al registrar un abono
    // Agregar en Cobranzas.php después de registrar_cobro()
    // -------------------------------------------------------
    public function generar_comision_por_pago($pago_id, $comprob_id, $importe_abonado) {
        // Verificar que no exista ya una comisión para este pago
        if ($this->Comisiones_model->pago_tiene_comision($pago_id)) return;

        // Obtener el comprobante y verificar que tenga vendedor
        $comprobante = $this->db
            ->select('vendedor_id, subtotal')
            ->where('id', $comprob_id)
            ->get('vt_comprobante')
            ->row();

        if (!$comprobante || !$comprobante->vendedor_id) return;

        // Obtener % de comisión actual de empresa
        $config = $this->Comisiones_model->obtener_config_empresa();
        if ((float)$config->comision_porcentaje <= 0) return;

        $monto_comision = round($importe_abonado * (float)$config->comision_porcentaje / 100, 2);

        $this->Comisiones_model->registrar_comision([
            'vendedor_id'      => $comprobante->vendedor_id,
            'comprob_id'       => $comprob_id,
            'pago_id'          => $pago_id,
            'fecha_pago'       => date('Y-m-d'),
            'subtotal_comprob' => $comprobante->subtotal,
            'importe_abonado'  => $importe_abonado,
            'pct_comision'     => $config->comision_porcentaje,
            'monto_comision'   => $monto_comision,
            'created_by'       => $this->session->userdata('id'),
            'created_at'       => date('Y-m-d H:i:s'),
        ]);
    }
}