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

class ActualizarPrecios extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('almacen/ActualizarPrecios_model');
        $this->load->model('configuracion/Empresa_model');
    }

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

        $categoria_id = $this->input->get('categoria_id', TRUE) ?: null;
        $buscar       = $this->input->get('buscar', TRUE) ?: null;

        $data['titulo']       = 'Actualización de Precios';
        $data['productos']    = $this->ActualizarPrecios_model->listar($categoria_id, $buscar);
        $data['categorias']   = $this->ActualizarPrecios_model->listar_categorias();
        $data['categoria_id'] = $categoria_id;
        $data['buscar']       = $buscar;
        $data['empresa']      = $this->Empresa_model->obtener_activa();

        $this->layout('almacen/actualizar_precios/index', $data);
    }

    // ---------------------------------------------------------------
    // CÁLCULO DE PRECIOS DERIVADOS (mismo criterio del Excel)
    // ---------------------------------------------------------------
    private function _redondear($total) {
        $frac = round($total - floor($total), 2);
        return ($frac >= 0.5) ? ceil($total) : floor($total);
    }

    private function _calcular_precios($base) {
        $base = (float)$base;

        $doce_calc        = $this->_redondear(($base + 0.20) * 12)  / 12;
        $veinticinco_calc = $this->_redondear(($base + 0.10) * 25)  / 25;
        $cincuenta_calc   = $this->_redondear(($base + 0.05) * 50)  / 50;

        return array(
            'precio_unidad'      => $doce_calc,        // venta1 = venta2
            'precio_doce'        => $doce_calc,
            'precio_veinticinco' => $veinticinco_calc,
            'precio_cincuenta'   => $cincuenta_calc,
            'precio_cien'        => $base,
            // precio_millar NO se modifica
        );
    }

    // ---------------------------------------------------------------
    // AJAX - VISTA PREVIA DE CÁLCULO (para un solo valor)
    // ---------------------------------------------------------------
    public function calcular() {
        $base = $this->input->post('precio_cien', TRUE);

        if ($base === null || $base === '' || !is_numeric($base)) {
            echo json_encode(array('status' => false, 'message' => 'Precio inválido'));
            return;
        }

        $precios = $this->_calcular_precios($base);

        echo json_encode(array(
            'status'  => true,
            'precios' => array(
                'precio_unidad'      => number_format($precios['precio_unidad'], 4, '.', ''),
                'precio_doce'        => number_format($precios['precio_doce'], 4, '.', ''),
                'precio_veinticinco' => number_format($precios['precio_veinticinco'], 4, '.', ''),
                'precio_cincuenta'   => number_format($precios['precio_cincuenta'], 4, '.', ''),
                'precio_cien'        => number_format($precios['precio_cien'], 4, '.', ''),
            )
        ));
    }

    // ---------------------------------------------------------------
    // GUARDAR CAMBIOS (batch)
    // ---------------------------------------------------------------
    public function guardar() {
        $this->validar_permiso('actualizar_precios_editar');

        $cambios = $this->input->post('cambios');

        if (empty($cambios) || !is_array($cambios)) {
            echo json_encode(array('status' => false, 'message' => 'No hay cambios para guardar'));
            return;
        }

        $actualizados = 0;

        foreach ($cambios as $item) {
            $id   = isset($item['id']) ? (int)$item['id'] : 0;
            $base = isset($item['precio_cien']) ? $item['precio_cien'] : null;

            if ($id <= 0 || $base === null || $base === '' || !is_numeric($base)) {
                continue;
            }

            $precios = $this->_calcular_precios($base);

            if ($this->ActualizarPrecios_model->actualizar_precios($id, $precios)) {
                $actualizados++;
            }
        }

        echo json_encode(array(
            'status'  => true,
            'message' => $actualizados . ' producto(s) actualizado(s) correctamente',
            'total'   => $actualizados
        ));
    }
}
