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

class Comisiones_model extends CI_Model {

    // -------------------------------------------------------
    // CONFIGURACIÓN
    // -------------------------------------------------------
    public function obtener_config_empresa() {
        return $this->db
            ->select('comision_porcentaje, comision_periodo')
            ->get('empresa')
            ->row();
    }

    // -------------------------------------------------------
    // VENDEDORES
    // -------------------------------------------------------
    public function listar_vendedores() {
        return $this->db
            ->select('
                e.id,
                CONCAT(e.apellidos, " ", e.nombres) as nombre_completo,
                e.comision_cuota
            ')
            ->from('rh_empleado e')
            ->where('e.estado', 1)
            ->order_by('e.apellidos', 'ASC')
            ->get()
            ->result();
    }

    public function obtener_vendedor($id) {
        return $this->db
            ->select('
                e.id,
                CONCAT(e.apellidos, " ", e.nombres) as nombre_completo,
                e.comision_cuota
            ')
            ->where('e.id', $id)
            ->get('rh_empleado e')
            ->row();
    }

    public function actualizar_cuota_vendedor($id, $cuota) {
        return $this->db
            ->where('id', $id)
            ->update('rh_empleado', [
                'comision_cuota' => $cuota,
                'updated_at'     => date('Y-m-d H:i:s'),
                'updated_by'     => $this->session->userdata('id'),
            ]);
    }

    // -------------------------------------------------------
    // TRAMOS
    // -------------------------------------------------------
    public function listar_tramos($vendedor_id) {
        return $this->db
            ->where('vendedor_id', $vendedor_id)
            ->where('estado', 1)
            ->order_by('desde_pct', 'ASC')
            ->get('fn_comision_tramo')
            ->result();
    }

    public function insertar_tramo($data) {
        $this->db->insert('fn_comision_tramo', $data);
        return $this->db->insert_id();
    }

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

    public function eliminar_tramo($id) {
        return $this->db
            ->where('id', $id)
            ->update('fn_comision_tramo', ['estado' => 0]);
    }

    // -------------------------------------------------------
    // REGISTRO DE COMISIONES
    // -------------------------------------------------------
    public function registrar_comision($data) {
        $this->db->insert('fn_comision_registro', $data);
        return $this->db->insert_id();
    }

    public function pago_tiene_comision($pago_id) {
        return $this->db
            ->where('pago_id', $pago_id)
            ->count_all_results('fn_comision_registro') > 0;
    }

    // -------------------------------------------------------
    // CÁLCULO DE FECHAS DEL PERÍODO
    // -------------------------------------------------------
    public function calcular_periodo($periodo, $fecha_ref = null) {
        $fecha_ref = $fecha_ref ?? date('Y-m-d');
        $año  = date('Y', strtotime($fecha_ref));
        $mes  = (int)date('m', strtotime($fecha_ref));

        switch (strtoupper($periodo)) {
            case 'BIMESTRAL':
                // Bimestre: 1-2, 3-4, 5-6, 7-8, 9-10, 11-12
                $bimestre   = ceil($mes / 2);
                $mes_inicio = ($bimestre - 1) * 2 + 1;
                $mes_fin    = $mes_inicio + 1;
                break;
            case 'TRIMESTRAL':
                // Trimestre: 1-3, 4-6, 7-9, 10-12
                $trimestre  = ceil($mes / 3);
                $mes_inicio = ($trimestre - 1) * 3 + 1;
                $mes_fin    = $mes_inicio + 2;
                break;
            default: // MENSUAL
                $mes_inicio = $mes;
                $mes_fin    = $mes;
                break;
        }

        return [
            'desde' => $año . '-' . str_pad($mes_inicio, 2, '0', STR_PAD_LEFT) . '-01',
            'hasta' => date('Y-m-t', strtotime($año . '-' . str_pad($mes_fin, 2, '0', STR_PAD_LEFT) . '-01')),
        ];
    }

    // -------------------------------------------------------
    // REPORTE DETALLE POR VENDEDOR
    // -------------------------------------------------------
    public function reporte_detalle($vendedor_id, $desde, $hasta) {
        return $this->db
            ->select('
                r.*,
                CONCAT(e.apellidos, " ", e.nombres) as vendedor_nombre,
                e.comision_cuota,
                c.serie,
                c.numero,
                c.fecha as fecha_comprobante,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                tc.nombre_corto as tipo_comprobante
            ')
            ->from('fn_comision_registro r')
            ->join('rh_empleado e',          'e.id = r.vendedor_id')
            ->join('vt_comprobante c',        'c.id = r.comprob_id')
            ->join('vt_cliente cl',           'cl.id = c.cliente_id')
            ->join('mt_tipo_comprobante tc',  'tc.id = c.comprobante_id', 'left')
            ->where('r.vendedor_id', $vendedor_id)
            ->where('r.fecha_pago >=', $desde)
            ->where('r.fecha_pago <=', $hasta)
            ->order_by('r.fecha_pago', 'ASC')
            ->order_by('r.id', 'ASC')
            ->get()
            ->result();
    }

    // -------------------------------------------------------
    // RESUMEN POR VENDEDOR EN UN PERÍODO
    // -------------------------------------------------------
    public function resumen_vendedor($vendedor_id, $desde, $hasta) {
        $row = $this->db
            ->select('
                IFNULL(SUM(r.importe_abonado), 0)  as total_abonado,
                IFNULL(SUM(r.monto_comision), 0)   as total_comision,
                COUNT(DISTINCT r.comprob_id)        as nro_comprobantes,
                MAX(r.fecha_pago)                   as ultimo_abono
            ')
            ->from('fn_comision_registro r')
            ->where('r.vendedor_id', $vendedor_id)
            ->where('r.fecha_pago >=', $desde)
            ->where('r.fecha_pago <=', $hasta)
            ->get()
            ->row();

        return $row;
    }

    // -------------------------------------------------------
    // RESUMEN TODOS LOS VENDEDORES (para el index)
    // -------------------------------------------------------
    public function resumen_todos_vendedores($desde, $hasta) {
        return $this->db
            ->select('
                e.id as vendedor_id,
                CONCAT(e.apellidos, " ", e.nombres) as vendedor_nombre,
                e.comision_cuota,
                IFNULL(SUM(r.importe_abonado), 0) as total_abonado,
                IFNULL(SUM(r.monto_comision), 0)  as total_comision,
                COUNT(DISTINCT r.comprob_id)       as nro_comprobantes
            ')
            ->from('rh_empleado e')
            ->join('fn_comision_registro r',
                'r.vendedor_id = e.id AND r.fecha_pago >= ' . $this->db->escape($desde) .
                ' AND r.fecha_pago <= ' . $this->db->escape($hasta), 'left')
            ->where('e.estado', 1)
            ->where('e.comision_cuota >', 0)
            ->group_by('e.id')
            ->order_by('e.apellidos', 'ASC')
            ->get()
            ->result();
    }

    // -------------------------------------------------------
    // CALCULAR BONO SEGÚN TRAMOS
    // -------------------------------------------------------
    public function calcular_bono($vendedor_id, $total_abonado, $cuota) {
        if ($cuota <= 0) return 0;

        $pct_cumplimiento = ($total_abonado / $cuota) * 100;

        // Traer todos los tramos activos del vendedor ordenados de mayor a menor
        $tramos = $this->db
            ->where('vendedor_id', $vendedor_id)
            ->where('estado', 1)
            ->order_by('desde_pct', 'DESC') // de mayor a menor para tomar el más alto alcanzado
            ->get('fn_comision_tramo')
            ->result();

        foreach ($tramos as $tramo) {
            if ($pct_cumplimiento >= (float)$tramo->desde_pct) {
                return (float)$tramo->bono;
            }
        }

        return 0; // No alcanzó ningún tramo
    }
}