<?php
namespace App\Http\Controllers\Api;

use App\Models\Producto;
use App\Models\Categoria;
use App\Models\ReferenciaCelular;
use App\Models\Color;
use App\Models\TipoProducto;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ProductoController extends Controller
{
    public function index(Request $request)
    {
        $query = Producto::with(['categoria', 'marcaProducto', 'referenciaCelular.marca', 'color', 'proveedor', 'tipoProducto'])
            ->where('activo', 1);

        if ($request->has('categoria_id')) {
            $query->where('categoria_id', $request->categoria_id);
        }
        if ($request->has('buscar')) {
            $query->where(function($q) use ($request) {
                $q->where('nombre', 'like', '%' . $request->buscar . '%')
                  ->orWhere('sku', 'like', '%' . $request->buscar . '%');
            });
        }

        return response()->json($query->orderBy('nombre')->get());
    }

    public function store(Request $request)
    {
        $request->validate([
            'nombre'               => 'required|string|max:255',
            'categoria_id'         => 'required|exists:categorias,id',
            'marca_producto_id'    => 'nullable|exists:marcas_producto,id',
            'referencia_celular_id'=> 'nullable|exists:referencias_celular,id',
            'color_id'             => 'nullable|exists:colores,id',
            'proveedor_id'         => 'nullable|exists:proveedores,id',
            'precio_costo'         => 'required|numeric|min:0',
            'precio_venta'         => 'required|numeric|min:0',
            'stock'                => 'integer|min:0',
            'stock_minimo'         => 'integer|min:0',
        ]);

        $sku = $this->generarSKU(
            $request->categoria_id,
            $request->referencia_celular_id,
            $request->color_id,
            $request->tipo_producto_id  // ← agregar
        );

        $producto = Producto::create([
            ...$request->only([
                'nombre', 'categoria_id', 'marca_producto_id',
                'referencia_celular_id', 'color_id', 'proveedor_id',
                'precio_costo', 'precio_venta', 'stock', 'stock_minimo',
                'tipo_producto_id' // ← agregar
            ]),
            'sku'    => $sku,
            'activo' => 1
        ]);

        return response()->json($producto->load(['categoria', 'marcaProducto', 'referenciaCelular.marca', 'color', 'proveedor']), 201);
    }

    public function show($id)
    {
        return response()->json(
            Producto::with(['categoria', 'marcaProducto', 'referenciaCelular.marca', 'color', 'proveedor', 'tipoProducto'])
                ->findOrFail($id)
        );
    }

    public function update(Request $request, $id)
    {
        $producto = Producto::findOrFail($id);

        $validated = $request->validate([
            'nombre'               => 'required|string|max:255',
            'categoria_id'         => 'required|exists:categorias,id',
            'marca_producto_id'    => 'nullable|exists:marcas_producto,id',
            'referencia_celular_id'=> 'nullable|exists:referencias_celular,id',
            'color_id'             => 'nullable|exists:colores,id',
            'proveedor_id'         => 'nullable|exists:proveedores,id',
            'tipo_producto_id'     => 'nullable|exists:tipos_producto,id',
            'precio_costo'         => 'required|numeric|min:0',
            'precio_venta'         => 'required|numeric|min:0',
            'stock'                => 'integer|min:0',
            'stock_minimo'         => 'integer|min:0',
        ]);

        $producto->update($validated);

        return response()->json($producto->fresh()->load(['categoria', 'marcaProducto', 'referenciaCelular.marca', 'color', 'proveedor', 'tipoProducto']));
    }

    public function destroy($id)
    {
        $producto = Producto::findOrFail($id);
        $producto->update(['activo' => 0]);
        return response()->json(['message' => 'Producto desactivado']);
    }

    public function toggleActivo($id)
    {
        $producto = Producto::findOrFail($id);
        $producto->update(['activo' => $producto->activo ? 0 : 1]);
        return response()->json([
            'message' => $producto->activo ? 'Producto activado' : 'Producto desactivado',
            'activo'  => $producto->activo
        ]);
    }

    public function previewSku(Request $request)
    {
        $sku = $this->generarSKU(
            $request->categoria_id,
            $request->referencia_celular_id,
            $request->color_id,
            $request->tipo_producto_id  // ← agregar
        );
        return response()->json(['sku' => $sku]);
    }

    // ── Generador de SKU ─────────────────────────────────────────────
    private function generarSKU($categoriaId, $referenciaId = null, $colorId = null, $tipoId = null): string
    {
        $prefijo = 'BT';

        $categoria    = Categoria::find($categoriaId);
        $codCategoria = strtoupper(substr($this->abreviar($categoria->nombre), 0, 3));

        $codReferencia = '';
        if ($referenciaId) {
            $referencia    = ReferenciaCelular::find($referenciaId);
            $codReferencia = $this->abreviar($referencia->nombre);
        }

        $codTipo = '';
        if ($tipoId) {
            $tipo    = TipoProducto::find($tipoId);
            $codTipo = strtoupper(substr($this->abreviar($tipo->nombre), 0, 3));
        }

        $codColor = '';
        if ($colorId) {
            $color    = Color::find($colorId);
            $codColor = strtoupper(substr($color->nombre, 0, 3));
        }

        $partes  = array_filter([$prefijo, $codCategoria, $codReferencia, $codTipo, $codColor]);
        $skuBase = implode('-', $partes);

        $skuFinal = $skuBase;
        $contador = 1;
        while (Producto::where('sku', $skuFinal)->exists()) {
            $skuFinal = $skuBase . '-' . str_pad($contador, 2, '0', STR_PAD_LEFT);
            $contador++;
        }

        return $skuFinal;
    }

    private function abreviar(string $texto): string
    {
        $texto = strtoupper($texto);
        $texto = preg_replace('/\s+/', '', $texto);
        $texto = preg_replace('/[AEIOU]/', '', $texto);
        return substr($texto, 0, 6);
    }
}