<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
use App\Models\MenuItem;
use App\Models\Restaurant;

class MenuItemController extends Controller
{
    /**
     * جلب قائمة الوجبات للمطعم
     */
    public function index(Request $request)
    {
        try {
            $user = $request->user();
            $restaurant = Restaurant::where('user_id', $user->id)->first();

            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }

            $menuItems = MenuItem::where('restaurant_id', $restaurant->id)
                ->orderBy('category')
                ->orderBy('name')
                ->get();

            return response()->json([
                'success' => true,
                'data' => $menuItems
            ]);

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

    /**
     * إضافة وجبة جديدة
     */
    public function store(Request $request)
    {
        try {
            $user = $request->user();
            $restaurant = Restaurant::where('user_id', $user->id)->first();

            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }

            $validator = Validator::make($request->all(), [
                'name' => 'required|string|max:255',
                'description' => 'nullable|string',
                'price' => 'required|numeric|min:0',
                'category' => 'required|string|max:255',
                'preparation_time_minutes' => 'nullable|integer|min:1',
                'ingredients' => 'nullable|string',
                'allergens' => 'nullable|string',
                'calories' => 'nullable|numeric|min:0',
                'is_available' => 'nullable|boolean',
                'is_popular' => 'nullable|boolean',
            ]);

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

            $menuItem = MenuItem::create([
                'restaurant_id' => $restaurant->id,
                'name' => $request->name,
                'description' => $request->description,
                'price' => $request->price,
                'category' => $request->category,
                'preparation_time_minutes' => $request->preparation_time_minutes ?? 15,
                'ingredients' => $request->ingredients,
                'allergens' => $request->allergens,
                'calories' => $request->calories,
                'is_available' => $request->is_available ?? true,
                'is_popular' => $request->is_popular ?? false,
            ]);

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

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

    /**
     * عرض وجبة محددة
     */
    public function show(Request $request, $id)
    {
        try {
            $user = $request->user();
            $restaurant = Restaurant::where('user_id', $user->id)->first();

            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }

            $menuItem = MenuItem::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();

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

            return response()->json([
                'success' => true,
                'data' => $menuItem
            ]);

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

    /**
     * تحديث وجبة
     */
    public function update(Request $request, $id)
    {
        try {
            $user = $request->user();
            $restaurant = Restaurant::where('user_id', $user->id)->first();

            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }

            $menuItem = MenuItem::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();

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

            $validator = Validator::make($request->all(), [
                'name' => 'sometimes|string|max:255',
                'description' => 'nullable|string',
                'price' => 'sometimes|numeric|min:0',
                'category' => 'sometimes|string|max:255',
                'preparation_time_minutes' => 'nullable|integer|min:1',
                'ingredients' => 'nullable|string',
                'allergens' => 'nullable|string',
                'calories' => 'nullable|numeric|min:0',
                'is_available' => 'nullable|boolean',
                'is_popular' => 'nullable|boolean',
            ]);

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

            $updateData = $request->only([
                'name', 'description', 'price', 'category',
                'preparation_time_minutes', 'ingredients', 'allergens',
                'calories', 'is_available', 'is_popular'
            ]);

            $menuItem->update($updateData);

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

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

    /**
     * حذف وجبة
     */
    public function destroy(Request $request, $id)
    {
        try {
            $user = $request->user();
            $restaurant = Restaurant::where('user_id', $user->id)->first();

            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }

            $menuItem = MenuItem::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();

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

            // حذف الصورة إذا كانت موجودة
            if ($menuItem->image) {
                Storage::disk('public')->delete($menuItem->image);
            }

            $menuItem->delete();

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

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

    /**
     * رفع صورة الوجبة
     */
    public function uploadImage(Request $request, $id)
    {
        try {
            $validator = Validator::make($request->all(), [
                'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
            ]);

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

            $user = $request->user();
            $restaurant = Restaurant::where('user_id', $user->id)->first();

            if (!$restaurant) {
                return response()->json([
                    'success' => false,
                    'message' => 'المطعم غير موجود'
                ], 404);
            }

            $menuItem = MenuItem::where('id', $id)
                ->where('restaurant_id', $restaurant->id)
                ->first();

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

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

            // حفظ الصورة الجديدة
            $imagePath = $request->file('image')->store('menu_items', 'public');
            
            $menuItem->update(['image' => $imagePath]);

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

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

    /**
     * جلب فئات الوجبات
     */
    public function getCategories()
    {
        try {
            $categories = [
                'وجبات رئيسية',
                'مقبلات',
                'حلويات',
                'مشروبات',
                'سلطات',
                'شوربات',
                'مشاوي',
                'أرز',
                'معجنات',
                'وجبات سريعة'
            ];

            return response()->json([
                'success' => true,
                'data' => $categories
            ]);

        } catch (\Exception $e) {
            \Log::error('خطأ في جلب الفئات: ' . $e->getMessage());
            
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء جلب الفئات'
            ], 500);
        }
    }

    /**
     * جلب الأطعمة الأكثر شهرة
     */
    public function getPopularFoods(Request $request)
    {
        try {
            $query = MenuItem::with(['restaurant' => function($q) {
                $q->where('is_active', true);
            }])
            ->where('is_available', true)
            ->where('is_popular', true);

            // فلترة حسب الموقع إذا تم توفيره
            if ($request->has('latitude') && $request->has('longitude')) {
                $latitude = $request->latitude;
                $longitude = $request->longitude;
                $radius = $request->get('radius', 10); // 10 كيلومتر افتراضياً

                $query->whereHas('restaurant', function($q) use ($latitude, $longitude, $radius) {
                    $q->whereRaw("
                        (6371 * acos(cos(radians(?)) 
                        * cos(radians(latitude)) 
                        * cos(radians(longitude) - radians(?)) 
                        + sin(radians(?)) 
                        * sin(radians(latitude)))) <= ?
                    ", [$latitude, $longitude, $latitude, $radius]);
                });
            }

            // فلترة حسب المدينة إذا تم توفيرها
            if ($request->has('city') && $request->city) {
                $query->whereHas('restaurant', function($q) use ($request) {
                    $q->where('address', 'like', '%' . $request->city . '%');
                });
            }

            // ترتيب حسب عدد الطلبات أو التقييم
            $sortBy = $request->get('sort_by', 'popularity');
            if ($sortBy === 'rating') {
                $query->orderBy('restaurant.rating', 'desc');
            } else {
                // ترتيب حسب الشعبية (عدد الطلبات)
                $query->withCount('foodOrderItems')
                    ->orderBy('food_order_items_count', 'desc');
            }

            $limit = $request->get('limit', 10);
            $popularFoods = $query->limit($limit)->get();

            return response()->json([
                'success' => true,
                'data' => $popularFoods
            ]);

        } catch (\Exception $e) {
            \Log::error('خطأ في جلب الأطعمة الشائعة: ' . $e->getMessage());
            
            return response()->json([
                'success' => false,
                'message' => 'حدث خطأ أثناء جلب الأطعمة الشائعة'
            ], 500);
        }
    }
}
