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

class Compras_model extends CI_Model
{
	public function __construct()
	{
		parent::__construct();
		$this->crear_tabla_si_no_existe();
	}

	public function obtener_materiales()
	{
		return $this->db
			->select('id, nombre, unidad, stock_actual, costo, proveedor')
			->order_by('nombre', 'ASC')
			->get('inventario_materiales')
			->result();
	}

	public function obtener_compras()
	{
		return $this->db
			->select('c.id, c.compra_ref, c.proveedor, c.material_id, c.cantidad, c.costo_unitario, c.creado_en, m.nombre AS material_nombre, m.unidad')
			->from('compras_materiales c')
			->join('inventario_materiales m', 'm.id = c.material_id', 'left')
			->order_by('c.id', 'DESC')
			->limit(60)
			->get()
			->result();
	}

	public function registrar_compra_multiple($proveedor, $items)
	{
		$compra_ref = date('YmdHis').'-'.mt_rand(100, 999);
		$this->db->trans_start();

		foreach ($items as $item) {
			$material_id = (int) $item['material_id'];
			$cantidad = (int) $item['cantidad'];
			$costo_unitario = (float) $item['costo_unitario'];

			$this->db->insert('compras_materiales', array(
				'compra_ref' => $compra_ref,
				'proveedor' => $proveedor,
				'material_id' => $material_id,
				'cantidad' => $cantidad,
				'costo_unitario' => $costo_unitario
			));

			$this->db->set('stock_actual', 'stock_actual + '.$cantidad, FALSE);
			$this->db->set('costo', $costo_unitario);
			$this->db->set('proveedor', $proveedor);
			$this->db->where('id', $material_id);
			$this->db->update('inventario_materiales');
		}

		$this->db->trans_complete();
		return $this->db->trans_status();
	}

	private function crear_tabla_si_no_existe()
	{
		$sql_materiales = "CREATE TABLE IF NOT EXISTS inventario_materiales (
			id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
			nombre VARCHAR(120) NOT NULL,
			unidad VARCHAR(30) NOT NULL DEFAULT 'unidad',
			stock_minimo INT NOT NULL DEFAULT 0,
			stock_actual INT NOT NULL DEFAULT 0,
			costo DECIMAL(10,2) NOT NULL DEFAULT 0.00,
			proveedor VARCHAR(120) NOT NULL DEFAULT 'Sin proveedor',
			nota VARCHAR(500) NULL,
			creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
		) ENGINE=InnoDB DEFAULT CHARSET=utf8";

		$sql = "CREATE TABLE IF NOT EXISTS compras_materiales (
			id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
			compra_ref VARCHAR(40) NOT NULL,
			proveedor VARCHAR(120) NOT NULL DEFAULT 'Sin proveedor',
			material_id INT UNSIGNED NOT NULL,
			cantidad INT NOT NULL,
			costo_unitario DECIMAL(10,2) NOT NULL DEFAULT 0.00,
			creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
			INDEX idx_material_id (material_id)
		) ENGINE=InnoDB DEFAULT CHARSET=utf8";

		$this->db->query($sql_materiales);
		$this->db->query($sql);
		$this->asegurar_estructura_compras();
	}

	private function asegurar_estructura_compras()
	{
		if (!$this->db->field_exists('compra_ref', 'compras_materiales')) {
			$this->db->query("ALTER TABLE compras_materiales ADD COLUMN compra_ref VARCHAR(40) NOT NULL DEFAULT 'legacy'");
		}
		if (!$this->db->field_exists('proveedor', 'compras_materiales')) {
			$this->db->query("ALTER TABLE compras_materiales ADD COLUMN proveedor VARCHAR(120) NOT NULL DEFAULT 'Sin proveedor'");
		}
	}
}
