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

use App\Models\OrdenServicio;
use App\Models\Cliente;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class OrdenServicioController extends Controller
{
    public function index(Request $request)
    {
        $query = OrdenServicio::with(['cliente', 'marcaCelular', 'referenciaCelular'])
            ->where('activo', 1);

        if ($request->has('estado')) {
            $query->where('estado', $request->estado);
        }
        if ($request->has('buscar')) {
            $query->where(function($q) use ($request) {
                $q->where('numero_orden', 'like', '%' . $request->buscar . '%')
                  ->orWhereHas('cliente', fn($c) =>
                        $c->where('nombre', 'like', '%' . $request->buscar . '%')
                          ->orWhere('telefono', 'like', '%' . $request->buscar . '%')
                  );
            });
        }

        return response()->json($query->orderByDesc('created_at')->get());
    }

    public function store(Request $request)
    {
        $request->validate([
            'cliente_id'             => 'required|exists:clientes,id',
            'marca_celular_id'       => 'nullable|exists:marcas_celular,id',
            'referencia_celular_id'  => 'nullable|exists:referencias_celular,id',
            'imei'                   => 'nullable|string|max:20',
            'condicion_ingreso'      => 'required|in:Bueno,Regular,Malo',
            'descripcion_falla'      => 'required|string',
            'observaciones_fisicas'  => 'nullable|string',
            'precio_diagnostico'     => 'nullable|numeric|min:0',
            'precio_reparacion'      => 'nullable|numeric|min:0',
            'costo_reparacion'       => 'nullable|numeric|min:0',
            'fecha_estimada_entrega' => 'nullable|date',
        ]);

        // Generar número de orden
        $ultimaOrden  = OrdenServicio::orderByDesc('id')->first();
        $numeroOrden  = 'OT-' . date('Y') . '-' . str_pad(($ultimaOrden?->id ?? 0) + 1, 4, '0', STR_PAD_LEFT);

        $orden = OrdenServicio::create([
            ...$request->only([
                'cliente_id', 'marca_celular_id', 'referencia_celular_id',
                'imei', 'condicion_ingreso', 'descripcion_falla',
                'observaciones_fisicas', 'precio_diagnostico',
                'precio_reparacion', 'costo_reparacion', 'fecha_estimada_entrega'
            ]),
            'numero_orden' => $numeroOrden,
            'estado'       => 'Recibido',
            'usuario'      => $request->usuario ?? 'Sistema',
            'activo'       => 1
        ]);

        return response()->json(
            $orden->load(['cliente', 'marcaCelular', 'referenciaCelular']), 201
        );
    }

    public function show($id)
    {
        return response()->json(
            OrdenServicio::with(['cliente', 'marcaCelular', 'referenciaCelular'])
                ->findOrFail($id)
        );
    }

    public function update(Request $request, $id)
    {
        $orden = OrdenServicio::findOrFail($id);
        $request->validate([
            'condicion_ingreso'      => 'required|in:Bueno,Regular,Malo',
            'descripcion_falla'      => 'required|string',
            'observaciones_fisicas'  => 'nullable|string',
            'precio_diagnostico'     => 'nullable|numeric|min:0',
            'precio_reparacion'      => 'nullable|numeric|min:0',
            'costo_reparacion'       => 'nullable|numeric|min:0',
            'fecha_estimada_entrega' => 'nullable|date',
        ]);

        $orden->update($request->only([
            'condicion_ingreso', 'descripcion_falla', 'observaciones_fisicas',
            'precio_diagnostico', 'precio_reparacion', 'costo_reparacion', 'fecha_estimada_entrega'
        ]));

        return response()->json($orden->load(['cliente', 'marcaCelular', 'referenciaCelular']));
    }

    public function destroy($id)
    {
        $orden = OrdenServicio::findOrFail($id);
        $orden->update(['activo' => 0]);
        return response()->json(['message' => 'Orden desactivada']);
    }

    public function cambiarEstado(Request $request, $id)
    {
        $request->validate([
            'estado' => 'required|in:Recibido,Diagnostico,En reparacion,Listo,Entregado'
        ]);

        $orden = OrdenServicio::findOrFail($id);
        $orden->update(['estado' => $request->estado]);

        return response()->json([
            'message' => "Estado actualizado a: {$request->estado}",
            'orden'   => $orden->load(['cliente', 'marcaCelular', 'referenciaCelular'])
        ]);
    }

    public function notificaciones()
    {
        $hoy        = now()->toDateString();
        $en7dias    = now()->addDays(7)->toDateString();

        $ordenes = OrdenServicio::with(['cliente', 'referenciaCelular'])
            ->whereNotIn('estado', ['Entregado'])
            ->whereNotNull('fecha_estimada_entrega')
            ->whereBetween('fecha_estimada_entrega', [$hoy, $en7dias])
            ->where('activo', 1)
            ->orderBy('fecha_estimada_entrega')
            ->get();

        return response()->json($ordenes);
    }
}