<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\GasCylinder;
use App\Models\GasOffice;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class GasOfficeCylinderController extends Controller
{
    /**
     * عرض قناني الغاز لمكتب الغاز
     */
    public function index(Request $request): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice) {
            return response()->json([
                'success' => false,
                'message' => 'مكتب غاز غير موجود'
            ], 404);
        }

        $query = $gasOffice->gasCylinders();

        // فلترة حسب الحجم
        if ($request->has('size')) {
            $query->bySize($request->size);
        }

        // فلترة حسب النوع
        if ($request->has('type')) {
            $query->byType($request->type);
        }

        // فلترة حسب المادة
        if ($request->has('material')) {
            $query->byMaterial($request->material);
        }

        // فلترة حسب الحالة
        if ($request->has('is_available')) {
            $query->where('is_available', $request->boolean('is_available'));
        }

        // فلترة حسب المخزون
        if ($request->has('in_stock')) {
            if ($request->boolean('in_stock')) {
                $query->inStock();
            } else {
                $query->where('stock_quantity', '<=', 0);
            }
        }

        // البحث بالاسم
        if ($request->has('search')) {
            $query->where('name', 'like', '%' . $request->search . '%');
        }

        $cylinders = $query->orderBy('created_at', 'desc')->paginate(20);

        return response()->json([
            'success' => true,
            'data' => $cylinders,
            'message' => 'تم جلب قناني الغاز بنجاح'
        ]);
    }

    /**
     * عرض قنينة غاز معينة
     */
    public function show(GasCylinder $gasCylinder): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasCylinder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'قنينة غاز غير موجودة أو غير مصرح لك بعرضها'
            ], 404);
        }

        return response()->json([
            'success' => true,
            'data' => $gasCylinder,
            'message' => 'تم جلب بيانات قنينة الغاز بنجاح'
        ]);
    }

    /**
     * إضافة قنينة غاز جديدة
     */
    public function store(Request $request): JsonResponse
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'price' => 'required|numeric|min:0',
            'size' => 'required|string|max:100',
            'type' => 'required|string|max:100',
            'material' => 'nullable|string|max:100',
            'brand' => 'nullable|string|max:100',
            'stock_quantity' => 'required|integer|min:0',
            'weight_kg' => 'required|numeric|min:0',
            'safety_instructions' => 'nullable|string',
            'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048'
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'بيانات غير صحيحة',
                'errors' => $validator->errors()
            ], 422);
        }

        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice) {
            return response()->json([
                'success' => false,
                'message' => 'مكتب غاز غير موجود'
            ], 404);
        }

        try {
            $data = $request->all();
            $data['gas_office_id'] = $gasOffice->id;
            $data['is_available'] = $request->get('is_available', true);

            // رفع الصورة إذا تم توفيرها
            if ($request->hasFile('image')) {
                $imagePath = $request->file('image')->store('gas-cylinders', 'public');
                $data['image'] = $imagePath;
            }

            $gasCylinder = GasCylinder::create($data);

            return response()->json([
                'success' => true,
                'data' => $gasCylinder,
                'message' => 'تم إضافة قنينة الغاز بنجاح'
            ], 201);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء إضافة قنينة الغاز',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * تحديث قنينة غاز
     */
    public function update(Request $request, GasCylinder $gasCylinder): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasCylinder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'قنينة غاز غير موجودة أو غير مصرح لك بتحديثها'
            ], 404);
        }

        $validator = Validator::make($request->all(), [
            'name' => 'sometimes|required|string|max:255',
            'description' => 'nullable|string',
            'price' => 'sometimes|required|numeric|min:0',
            'size' => 'sometimes|required|string|max:100',
            'type' => 'sometimes|required|string|max:100',
            'material' => 'nullable|string|max:100',
            'brand' => 'nullable|string|max:100',
            'stock_quantity' => 'sometimes|required|integer|min:0',
            'weight_kg' => 'sometimes|required|numeric|min:0',
            'safety_instructions' => 'nullable|string',
            'is_available' => 'sometimes|boolean',
            'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048'
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'بيانات غير صحيحة',
                'errors' => $validator->errors()
            ], 422);
        }

        try {
            $data = $request->all();

            // رفع صورة جديدة إذا تم توفيرها
            if ($request->hasFile('image')) {
                // حذف الصورة القديمة
                if ($gasCylinder->image) {
                    Storage::disk('public')->delete($gasCylinder->image);
                }
                
                $imagePath = $request->file('image')->store('gas-cylinders', 'public');
                $data['image'] = $imagePath;
            }

            $gasCylinder->update($data);

            return response()->json([
                'success' => true,
                'data' => $gasCylinder,
                'message' => 'تم تحديث قنينة الغاز بنجاح'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء تحديث قنينة الغاز',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * حذف قنينة غاز
     */
    public function destroy(GasCylinder $gasCylinder): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasCylinder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'قنينة غاز غير موجودة أو غير مصرح لك بحذفها'
            ], 404);
        }

        // التحقق من وجود طلبات لهذه القنينة
        if ($gasCylinder->orderItems()->exists()) {
            return response()->json([
                'success' => false,
                'message' => 'لا يمكن حذف قنينة غاز لها طلبات مرتبطة'
            ], 400);
        }

        try {
            // حذف الصورة
            if ($gasCylinder->image) {
                Storage::disk('public')->delete($gasCylinder->image);
            }

            $gasCylinder->delete();

            return response()->json([
                'success' => true,
                'message' => 'تم حذف قنينة الغاز بنجاح'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء حذف قنينة الغاز',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * تحديث المخزون
     */
    public function updateStock(Request $request, GasCylinder $gasCylinder): JsonResponse
    {
        $request->validate([
            'stock_quantity' => 'required|integer|min:0',
            'operation' => 'required|in:set,add,subtract'
        ]);

        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasCylinder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'قنينة غاز غير موجودة أو غير مصرح لك بتحديثها'
            ], 404);
        }

        try {
            $newQuantity = $gasCylinder->stock_quantity;

            switch ($request->operation) {
                case 'set':
                    $newQuantity = $request->stock_quantity;
                    break;
                case 'add':
                    $newQuantity += $request->stock_quantity;
                    break;
                case 'subtract':
                    $newQuantity -= $request->stock_quantity;
                    if ($newQuantity < 0) $newQuantity = 0;
                    break;
            }

            $gasCylinder->update(['stock_quantity' => $newQuantity]);

            return response()->json([
                'success' => true,
                'data' => [
                    'old_quantity' => $gasCylinder->stock_quantity,
                    'new_quantity' => $newQuantity,
                    'operation' => $request->operation
                ],
                'message' => 'تم تحديث المخزون بنجاح'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء تحديث المخزون',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * رفع صورة قنينة غاز
     */
    public function uploadImage(Request $request, GasCylinder $gasCylinder): JsonResponse
    {
        $request->validate([
            'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048'
        ]);

        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice || $gasCylinder->gas_office_id !== $gasOffice->id) {
            return response()->json([
                'success' => false,
                'message' => 'قنينة غاز غير موجودة أو غير مصرح لك بتحديثها'
            ], 404);
        }

        try {
            // حذف الصورة القديمة
            if ($gasCylinder->image) {
                Storage::disk('public')->delete($gasCylinder->image);
            }

            // رفع الصورة الجديدة
            $imagePath = $request->file('image')->store('gas-cylinders', 'public');
            $gasCylinder->update(['image' => $imagePath]);

            return response()->json([
                'success' => true,
                'data' => [
                    'image_url' => asset('storage/' . $imagePath)
                ],
                'message' => 'تم رفع الصورة بنجاح'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء رفع الصورة',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * إحصائيات القناني
     */
    public function getStats(): JsonResponse
    {
        $user = Auth::user();
        $gasOffice = GasOffice::where('owner_id', $user->id)->first();

        if (!$gasOffice) {
            return response()->json([
                'success' => false,
                'message' => 'مكتب غاز غير موجود'
            ], 404);
        }

        $stats = [
            'total_cylinders' => $gasOffice->gasCylinders()->count(),
            'available_cylinders' => $gasOffice->gasCylinders()->where('is_available', true)->count(),
            'out_of_stock' => $gasOffice->gasCylinders()->where('stock_quantity', '<=', 0)->count(),
            'low_stock' => $gasOffice->gasCylinders()->where('stock_quantity', '>', 0)
                ->where('stock_quantity', '<=', 5)->count(),
            'by_type' => $gasOffice->gasCylinders()
                ->selectRaw('type, COUNT(*) as count')
                ->groupBy('type')
                ->get(),
            'by_size' => $gasOffice->gasCylinders()
                ->selectRaw('size, COUNT(*) as count')
                ->groupBy('size')
                ->get(),
        ];

        return response()->json([
            'success' => true,
            'data' => $stats,
            'message' => 'تم جلب إحصائيات القناني بنجاح'
        ]);
    }
}
