<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Governorate;
use App\Models\City;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class CityController extends Controller
{
    /**
     * عرض قائمة المدن
     */
    public function index(Request $request)
    {
        $query = City::with('governorate');

        // فلترة حسب المحافظة
        if ($request->filled('governorate_id')) {
            $query->where('governorate_id', $request->governorate_id);
        }

        // فلترة حسب النشاط
        if ($request->filled('is_active')) {
            $query->where('is_active', $request->is_active);
        }

        // البحث
        if ($request->filled('search')) {
            $search = $request->search;
            $query->where(function($q) use ($search) {
                $q->where('name_ar', 'like', "%$search%")
                  ->orWhere('name_en', 'like', "%$search%")
                  ->orWhere('code', 'like', "%$search%");
            });
        }

        $cities = $query->orderBy('governorate_id')
            ->orderBy('sort_order')
            ->orderBy('name_ar')
            ->paginate(20);

        $governorates = Governorate::active()->orderBy('name_ar')->get();

        return view('admin.cities.index', compact('cities', 'governorates'));
    }

    /**
     * عرض صفحة إنشاء مدينة جديدة
     */
    public function create()
    {
        $governorates = Governorate::active()->orderBy('name_ar')->get();
        return view('admin.cities.create', compact('governorates'));
    }

    /**
     * حفظ مدينة جديدة
     */
    public function store(Request $request)
    {
        $request->validate([
            'governorate_id' => 'required|exists:governorates,id',
            'name_ar' => 'required|string|max:255',
            'name_en' => 'required|string|max:255',
            'code' => 'nullable|string|max:10',
            'latitude' => 'nullable|numeric|between:-90,90',
            'longitude' => 'nullable|numeric|between:-180,180',
            'sort_order' => 'nullable|integer|min:0',
        ]);

        // التحقق من عدم تكرار الاسم في نفس المحافظة
        $existingCity = City::where('governorate_id', $request->governorate_id)
            ->where('name_ar', $request->name_ar)
            ->first();

        if ($existingCity) {
            return back()->withInput()
                ->with('error', 'يوجد مدينة بهذا الاسم في نفس المحافظة');
        }

        try {
            DB::beginTransaction();

            $city = City::create([
                'governorate_id' => $request->governorate_id,
                'name_ar' => $request->name_ar,
                'name_en' => $request->name_en,
                'code' => $request->code,
                'latitude' => $request->latitude,
                'longitude' => $request->longitude,
                'sort_order' => $request->sort_order ?? 0,
                'is_active' => $request->has('is_active'),
            ]);

            DB::commit();

            return redirect()->route('admin.cities.index')
                ->with('success', 'تم إنشاء المدينة بنجاح');

        } catch (\Exception $e) {
            DB::rollBack();
            return back()->withInput()
                ->with('error', 'حدث خطأ أثناء إنشاء المدينة: ' . $e->getMessage());
        }
    }

    /**
     * عرض تفاصيل مدينة معينة
     */
    public function show(City $city)
    {
        $city->load('governorate');
        return view('admin.cities.show', compact('city'));
    }

    /**
     * عرض صفحة تعديل مدينة
     */
    public function edit(City $city)
    {
        $governorates = Governorate::active()->orderBy('name_ar')->get();
        return view('admin.cities.edit', compact('city', 'governorates'));
    }

    /**
     * تحديث مدينة
     */
    public function update(Request $request, City $city)
    {
        $request->validate([
            'governorate_id' => 'required|exists:governorates,id',
            'name_ar' => 'required|string|max:255',
            'name_en' => 'required|string|max:255',
            'code' => 'nullable|string|max:10',
            'latitude' => 'nullable|numeric|between:-90,90',
            'longitude' => 'nullable|numeric|between:-180,180',
            'sort_order' => 'nullable|integer|min:0',
        ]);

        // التحقق من عدم تكرار الاسم في نفس المحافظة
        $existingCity = City::where('governorate_id', $request->governorate_id)
            ->where('name_ar', $request->name_ar)
            ->where('id', '!=', $city->id)
            ->first();

        if ($existingCity) {
            return back()->withInput()
                ->with('error', 'يوجد مدينة بهذا الاسم في نفس المحافظة');
        }

        try {
            $city->update([
                'governorate_id' => $request->governorate_id,
                'name_ar' => $request->name_ar,
                'name_en' => $request->name_en,
                'code' => $request->code,
                'latitude' => $request->latitude,
                'longitude' => $request->longitude,
                'sort_order' => $request->sort_order ?? 0,
                'is_active' => $request->has('is_active'),
            ]);

            return redirect()->route('admin.cities.index')
                ->with('success', 'تم تحديث المدينة بنجاح');

        } catch (\Exception $e) {
            return back()->withInput()
                ->with('error', 'حدث خطأ أثناء تحديث المدينة: ' . $e->getMessage());
        }
    }

    /**
     * حذف مدينة
     */
    public function destroy(City $city)
    {
        try {
            // التحقق من وجود مطاعم مرتبطة
            if ($city->restaurants()->count() > 0) {
                return back()->with('error', 'لا يمكن حذف المدينة لوجود مطاعم مرتبطة بها');
            }

            // التحقق من وجود مستخدمين مرتبطين
            if ($city->users()->count() > 0) {
                return back()->with('error', 'لا يمكن حذف المدينة لوجود مستخدمين مرتبطين بها');
            }

            $city->delete();

            return redirect()->route('admin.cities.index')
                ->with('success', 'تم حذف المدينة بنجاح');

        } catch (\Exception $e) {
            return back()->with('error', 'حدث خطأ أثناء حذف المدينة: ' . $e->getMessage());
        }
    }

    /**
     * تبديل حالة المدينة (نشط/غير نشط)
     */
    public function toggleStatus(City $city)
    {
        try {
            $city->update(['is_active' => !$city->is_active]);

            $status = $city->is_active ? 'تفعيل' : 'إلغاء تفعيل';
            return back()->with('success', "تم $status المدينة بنجاح");

        } catch (\Exception $e) {
            return back()->with('error', 'حدث خطأ أثناء تغيير حالة المدينة: ' . $e->getMessage());
        }
    }

    /**
     * جلب مدن محافظة معينة (AJAX)
     */
    public function getCitiesByGovernorate(Request $request)
    {
        \Log::info('طلب جلب المدن', [
            'governorate_id' => $request->governorate_id,
            'request_data' => $request->all()
        ]);

        $cities = City::where('governorate_id', $request->governorate_id)
            ->active()
            ->orderBy('sort_order')
            ->orderBy('name_ar')
            ->get();

        \Log::info('المدن المسترجعة', [
            'count' => $cities->count(),
            'cities' => $cities->toArray()
        ]);

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