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

class Costos extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('produccion/Costos_model');
        $this->load->helper('permisos');
    }

    // =========================================================
    // DASHBOARD
    // =========================================================

    public function index() {
        $this->validar_permiso('costos_ver');

        $data['titulo']  = 'Módulo de Costos';
        $data['resumen'] = $this->Costos_model->resumen_dashboard();
        $this->layout('produccion/costos/index', $data);
    }

    // =========================================================
    // INSUMOS
    // =========================================================

    public function insumos() {
        $this->validar_permiso('costos_ver');

        $data['titulo']  = 'Insumos / Materias Primas';
        $data['insumos'] = $this->Costos_model->listar_insumos(false);
        $this->layout('produccion/costos/insumos', $data);
    }

    public function insumos_create() {
        $this->validar_permiso('costos_insumo_crear');

        $data['titulo']      = 'Nuevo Insumo';
        $data['unidades']    = $this->Costos_model->listar_unidades_medida();
        $data['monedas']     = $this->Costos_model->listar_monedas();
        $data['proveedores'] = $this->Costos_model->listar_proveedores();
        $this->layout('produccion/costos/insumos_create', $data);
    }

    public function insumos_store() {
        $this->validar_permiso('costos_insumo_crear');

        $this->form_validation->set_rules('nombre',          'Nombre',          'required|trim|max_length[150]');
        $this->form_validation->set_rules('um_id',           'Unidad medida',   'required|integer');
        $this->form_validation->set_rules('precio_unitario', 'Precio unitario', 'required|decimal');

        if ($this->form_validation->run() == FALSE) {
            $this->session->set_flashdata('error', validation_errors());
            redirect('produccion/costos/insumos/create');
        }

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

        $data = array(
            'nombre'          => trim($this->input->post('nombre')),
            'descripcion'     => trim($this->input->post('descripcion')),
            'um_id'           => $this->input->post('um_id'),
            'moneda_id'       => $this->input->post('moneda_id'),
            'precio_unitario' => $this->input->post('precio_unitario'),
            'proveedor_id'    => $proveedor_id ?: NULL,
            'estado'          => 1,
            'created_at'      => date('Y-m-d H:i:s'),
            'created_by'      => $this->session->userdata('id'),
        );

        $this->Costos_model->insertar_insumo($data);
        $this->session->set_flashdata('success', 'Insumo registrado correctamente.');
        redirect('produccion/costos/insumos');
    }

    public function insumos_edit($id) {
        $this->validar_permiso('costos_insumo_editar');

        $insumo = $this->Costos_model->obtener_insumo($id);
        if (!$insumo) show_404();

        $data['titulo']      = 'Editar Insumo';
        $data['insumo']      = $insumo;
        $data['unidades']    = $this->Costos_model->listar_unidades_medida();
        $data['monedas']     = $this->Costos_model->listar_monedas();
        $data['proveedores'] = $this->Costos_model->listar_proveedores();
        $this->layout('produccion/costos/insumos_edit', $data);
    }

    public function insumos_update($id) {
        $this->validar_permiso('costos_insumo_editar');

        $this->form_validation->set_rules('nombre',          'Nombre',          'required|trim|max_length[150]');
        $this->form_validation->set_rules('um_id',           'Unidad medida',   'required|integer');
        $this->form_validation->set_rules('precio_unitario', 'Precio unitario', 'required|decimal');

        if ($this->form_validation->run() == FALSE) {
            $this->session->set_flashdata('error', validation_errors());
            redirect('produccion/costos/insumos/edit/' . $id);
        }

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

        $data = array(
            'nombre'          => trim($this->input->post('nombre')),
            'descripcion'     => trim($this->input->post('descripcion')),
            'um_id'           => $this->input->post('um_id'),
            'moneda_id'       => $this->input->post('moneda_id'),
            'precio_unitario' => $this->input->post('precio_unitario'),
            'proveedor_id'    => $proveedor_id ?: NULL,
            'updated_at'      => date('Y-m-d H:i:s'),
            'updated_by'      => $this->session->userdata('id'),
        );

        $this->Costos_model->actualizar_insumo($id, $data);
        $this->session->set_flashdata('success', 'Insumo actualizado correctamente.');
        redirect('produccion/costos/insumos');
    }

    public function insumos_estado($id) {
        $this->validar_permiso('costos_insumo_editar');

        $insumo = $this->Costos_model->obtener_insumo($id);
        if (!$insumo) show_404();

        $this->Costos_model->actualizar_insumo($id, array(
            'estado'     => $insumo->estado ? 0 : 1,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id'),
        ));

        $this->session->set_flashdata('success', 'Estado actualizado.');
        redirect('produccion/costos/insumos');
    }

    // =========================================================
    // PROCESOS
    // =========================================================

    public function procesos() {
        $this->validar_permiso('costos_ver');

        $data['titulo']   = 'Procesos Productivos';
        $data['procesos'] = $this->Costos_model->listar_procesos(false);
        $this->layout('produccion/costos/procesos', $data);
    }

    public function procesos_create() {
        $this->validar_permiso('costos_proceso_crear');

        $data['titulo'] = 'Nuevo Proceso';
        $this->layout('produccion/costos/procesos_create', $data);
    }

    public function procesos_store() {
        $this->validar_permiso('costos_proceso_crear');

        $this->form_validation->set_rules('nombre',     'Nombre',     'required|trim|max_length[150]');
        $this->form_validation->set_rules('tipo_costo', 'Tipo costo', 'required|in_list[HORA,LOTE]');
        $this->form_validation->set_rules('costo',      'Costo',      'required|decimal');

        if ($this->form_validation->run() == FALSE) {
            $this->session->set_flashdata('error', validation_errors());
            redirect('produccion/costos/procesos/create');
        }

        $tipo = $this->input->post('tipo_costo');

        $data = array(
            'nombre'         => trim($this->input->post('nombre')),
            'descripcion'    => trim($this->input->post('descripcion')),
            'tipo_costo'     => $tipo,
            'costo'          => $this->input->post('costo'),
            'lote_cantidad'  => ($tipo === 'LOTE') ? (int)$this->input->post('lote_cantidad') : 1,
            'es_tercerizado' => $this->input->post('es_tercerizado') ? 1 : 0,
            'estado'         => 1,
            'created_at'     => date('Y-m-d H:i:s'),
            'created_by'     => $this->session->userdata('id'),
        );

        $this->Costos_model->insertar_proceso($data);
        $this->session->set_flashdata('success', 'Proceso registrado correctamente.');
        redirect('produccion/costos/procesos');
    }

    public function procesos_edit($id) {
        $this->validar_permiso('costos_proceso_crear');

        $proceso = $this->Costos_model->obtener_proceso($id);
        if (!$proceso) show_404();

        $data['titulo']  = 'Editar Proceso';
        $data['proceso'] = $proceso;
        $this->layout('produccion/costos/procesos_edit', $data);
    }

    public function procesos_update($id) {
        $this->validar_permiso('costos_proceso_crear');

        $tipo = $this->input->post('tipo_costo');

        $data = array(
            'nombre'         => trim($this->input->post('nombre')),
            'descripcion'    => trim($this->input->post('descripcion')),
            'tipo_costo'     => $tipo,
            'costo'          => $this->input->post('costo'),
            'lote_cantidad'  => ($tipo === 'LOTE') ? (int)$this->input->post('lote_cantidad') : 1,
            'es_tercerizado' => $this->input->post('es_tercerizado') ? 1 : 0,
            'updated_at'     => date('Y-m-d H:i:s'),
            'updated_by'     => $this->session->userdata('id'),
        );

        $this->Costos_model->actualizar_proceso($id, $data);
        $this->session->set_flashdata('success', 'Proceso actualizado.');
        redirect('produccion/costos/procesos');
    }

    public function procesos_estado($id) {
        $this->validar_permiso('costos_proceso_crear');

        $proc = $this->Costos_model->obtener_proceso($id);
        if (!$proc) show_404();

        $this->Costos_model->actualizar_proceso($id, array(
            'estado'     => $proc->estado ? 0 : 1,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id'),
        ));

        $this->session->set_flashdata('success', 'Estado actualizado.');
        redirect('produccion/costos/procesos');
    }

    // =========================================================
    // GASTOS FIJOS
    // =========================================================

    public function gastos_fijos() {
        $this->validar_permiso('costos_ver');

        $data['titulo'] = 'Gastos Fijos';
        $data['gastos'] = $this->Costos_model->listar_gastos_fijos(false);
        $this->layout('produccion/costos/gastos', $data);
    }

    public function gastos_create() {
        $this->validar_permiso('costos_gasto_crear');

        $data['titulo']  = 'Nuevo Gasto Fijo';
        $data['monedas'] = $this->Costos_model->listar_monedas();
        $this->layout('produccion/costos/gastos_create', $data);
    }

    public function gastos_store() {
        $this->validar_permiso('costos_gasto_crear');

        $this->form_validation->set_rules('nombre',        'Nombre',        'required|trim');
        $this->form_validation->set_rules('monto_mensual', 'Monto mensual', 'required|decimal');

        if ($this->form_validation->run() == FALSE) {
            $this->session->set_flashdata('error', validation_errors());
            redirect('produccion/costos/gastos_fijos/create');
        }

        $data = array(
            'nombre'        => trim($this->input->post('nombre')),
            'descripcion'   => trim($this->input->post('descripcion')),
            'monto_mensual' => $this->input->post('monto_mensual'),
            'moneda_id'     => $this->input->post('moneda_id'),
            'estado'        => 1,
            'created_at'    => date('Y-m-d H:i:s'),
            'created_by'    => $this->session->userdata('id'),
        );

        $this->Costos_model->insertar_gasto_fijo($data);
        $this->session->set_flashdata('success', 'Gasto fijo registrado.');
        redirect('produccion/costos/gastos_fijos');
    }

    public function gastos_edit($id) {
        $this->validar_permiso('costos_gasto_crear');

        $gasto = $this->Costos_model->obtener_gasto_fijo($id);
        if (!$gasto) show_404();

        $data['titulo']  = 'Editar Gasto Fijo';
        $data['gasto']   = $gasto;
        $data['monedas'] = $this->Costos_model->listar_monedas();
        $this->layout('produccion/costos/gastos_edit', $data);
    }

    public function gastos_update($id) {
        $this->validar_permiso('costos_gasto_crear');

        $data = array(
            'nombre'        => trim($this->input->post('nombre')),
            'descripcion'   => trim($this->input->post('descripcion')),
            'monto_mensual' => $this->input->post('monto_mensual'),
            'moneda_id'     => $this->input->post('moneda_id'),
            'updated_at'    => date('Y-m-d H:i:s'),
            'updated_by'    => $this->session->userdata('id'),
        );

        $this->Costos_model->actualizar_gasto_fijo($id, $data);
        $this->session->set_flashdata('success', 'Gasto fijo actualizado.');
        redirect('produccion/costos/gastos_fijos');
    }

    public function gastos_estado($id) {
        $this->validar_permiso('costos_gasto_crear');

        $gasto = $this->Costos_model->obtener_gasto_fijo($id);
        if (!$gasto) show_404();

        $this->Costos_model->actualizar_gasto_fijo($id, array(
            'estado'     => $gasto->estado ? 0 : 1,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id'),
        ));

        $this->session->set_flashdata('success', 'Estado actualizado.');
        redirect('produccion/costos/gastos_fijos');
    }

    // =========================================================
    // HOJAS DE COSTOS
    // =========================================================

    public function hojas() {
        $this->validar_permiso('costos_ver');

        $data['titulo']    = 'Hojas de Costos';
        $data['productos'] = $this->Costos_model->listar_productos_con_hoja();
        $this->layout('produccion/costos/hojas', $data);
    }

    public function hojas_create($producto_id = null) {
        $this->validar_permiso('costos_hoja_crear');

        $data['titulo']    = 'Nueva Hoja de Costos';
        $data['productos'] = $this->Costos_model->listar_productos_activos();
        $data['producto']  = $producto_id ? $this->Costos_model->obtener_producto_vt($producto_id) : NULL;
        $this->layout('produccion/costos/hojas_create', $data);
    }

    public function hojas_store() {
        $this->validar_permiso('costos_hoja_crear');

        $this->form_validation->set_rules('producto_id', 'Producto', 'required|integer');

        if ($this->form_validation->run() == FALSE) {
            $this->session->set_flashdata('error', validation_errors());
            redirect('produccion/costos/hojas/create');
        }

        $data = array(
            'producto_id'  => $this->input->post('producto_id'),
            'nombre'       => trim($this->input->post('nombre')) ?: NULL,
            'notas'        => trim($this->input->post('notas')),
            'es_principal' => $this->input->post('es_principal') ? 1 : 0,
            'estado'       => 1,
            'created_at'   => date('Y-m-d H:i:s'),
            'created_by'   => $this->session->userdata('id'),
        );

        $hoja_id = $this->Costos_model->insertar_hoja($data);
        $this->session->set_flashdata('success', 'Hoja creada. Ahora asigná los componentes del costo.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    public function hojas_ver($id) {
        $this->validar_permiso('costos_ver');

        $hoja = $this->Costos_model->obtener_hoja($id);
        if (!$hoja) show_404();

        $data['titulo']         = 'Hoja de Costos';
        $data['costo']          = $this->Costos_model->calcular_costo($id);
        $data['todos_insumos']  = $this->Costos_model->listar_insumos();
        $data['todos_procesos'] = $this->Costos_model->listar_procesos();
        $data['todos_gastos']   = $this->Costos_model->listar_gastos_fijos();
        $this->layout('produccion/costos/hojas_ver', $data);
    }

    public function hojas_estado($id) {
        $this->validar_permiso('costos_hoja_crear');

        $hoja = $this->Costos_model->obtener_hoja($id);
        if (!$hoja) show_404();

        $this->Costos_model->actualizar_hoja($id, array(
            'estado'     => $hoja->estado ? 0 : 1,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id'),
        ));

        $this->session->set_flashdata('success', 'Estado actualizado.');
        redirect('produccion/costos/hojas');
    }

    // =========================================================
    // DETALLE HOJA — Insumos
    // =========================================================

    public function hoja_agregar_insumo($hoja_id) {
        $this->validar_permiso('costos_hoja_crear');

        $this->Costos_model->guardar_hoja_insumo(array(
            'hoja_id'     => $hoja_id,
            'insumo_id'   => $this->input->post('insumo_id'),
            'cantidad'    => $this->input->post('cantidad')    ?: 1,
            'rendimiento' => $this->input->post('rendimiento') ?: 1,
            'notas'       => $this->input->post('notas'),
        ));

        $this->session->set_flashdata('success', 'Insumo agregado.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    public function hoja_quitar_insumo($detalle_id, $hoja_id) {
        $this->validar_permiso('costos_hoja_crear');

        $this->Costos_model->eliminar_hoja_insumo($detalle_id);
        $this->session->set_flashdata('success', 'Insumo quitado.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    // =========================================================
    // DETALLE HOJA — Procesos
    // =========================================================

    public function hoja_agregar_proceso($hoja_id) {
        $this->validar_permiso('costos_hoja_crear');

        $this->Costos_model->guardar_hoja_proceso(array(
            'hoja_id'             => $hoja_id,
            'proceso_id'          => $this->input->post('proceso_id'),
            'minutos'             => $this->input->post('minutos')             ?: NULL,
            'costo_lote_override' => $this->input->post('costo_lote_override') ?: NULL,
            'incluye_flete'       => $this->input->post('incluye_flete') ? 1 : 0,
            'costo_flete'         => $this->input->post('costo_flete')         ?: NULL,
            'flete_lote_qty'      => $this->input->post('flete_lote_qty')       ?: 1000,
            'notas'               => $this->input->post('notas'),
        ));

        $this->session->set_flashdata('success', 'Proceso agregado.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    public function hoja_quitar_proceso($detalle_id, $hoja_id) {
        $this->validar_permiso('costos_hoja_crear');

        $this->Costos_model->eliminar_hoja_proceso($detalle_id);
        $this->session->set_flashdata('success', 'Proceso quitado.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    // =========================================================
    // DETALLE HOJA — Gastos fijos
    // =========================================================

    public function hoja_agregar_gasto($hoja_id) {
        $this->validar_permiso('costos_hoja_crear');

        $this->Costos_model->guardar_hoja_gasto(array(
            'hoja_id'         => $hoja_id,
            'gasto_fijo_id'   => $this->input->post('gasto_fijo_id'),
            'tipo_asignacion' => $this->input->post('tipo_asignacion'),
            'valor'           => $this->input->post('valor'),
            'notas'           => $this->input->post('notas'),
        ));

        $this->session->set_flashdata('success', 'Gasto fijo agregado.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    public function hoja_quitar_gasto($detalle_id, $hoja_id) {
        $this->validar_permiso('costos_hoja_crear');

        $this->Costos_model->eliminar_hoja_gasto($detalle_id);
        $this->session->set_flashdata('success', 'Gasto fijo quitado.');
        redirect('produccion/costos/hojas/ver/' . $hoja_id);
    }

    // =========================================================
    // AJAX — Búsqueda de productos para autocomplete
    // =========================================================

    public function buscar_productos() {
        $term = trim($this->input->get('term', TRUE));

        if (strlen($term) < 2) {
            echo json_encode(array());
            return;
        }

        $productos = $this->Costos_model->buscar_productos($term);
        $resultado = array();

        foreach ($productos as $item) {
            $resultado[] = array(
                'id'    => $item->id,
                'label' => $item->codigo . ' — ' . $item->nombre,
                'value' => $item->codigo . ' — ' . $item->nombre,
                'codigo' => $item->codigo,
                'nombre' => $item->nombre,
            );
        }

        echo json_encode($resultado);
    }
}
