<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\GasOffice;
use App\Models\User;
use App\Models\GasCylinder;
use App\Models\GasOrder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class GasOfficeController extends Controller
{
    /**
     * عرض قائمة مكاتب الغاز
     */
    public function index(Request $request)
    {
        $query = GasOffice::with('owner');

        // فلترة حسب الحالة
        if ($request->has('status')) {
            if ($request->status === 'active') {
                $query->where('is_active', true);
            } elseif ($request->status === 'inactive') {
                $query->where('is_active', false);
            }
        }

        // فلترة حسب المنطقة
        if ($request->has('governorate')) {
            $query->whereJsonContains('service_areas', $request->governorate);
        }

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

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

        return view('admin.gas-offices.index', compact('gasOffices'));
    }

    /**
     * عرض تفاصيل مكتب غاز
     */
    public function show(GasOffice $gasOffice)
    {
        $gasOffice->load(['owner', 'gasCylinders', 'gasOrders' => function($query) {
            $query->with(['customer', 'driver'])->latest()->take(10);
        }]);

        $stats = [
            'total_cylinders' => $gasOffice->gasCylinders()->count(),
            'available_cylinders' => $gasOffice->gasCylinders()->where('is_available', true)->count(),
            'total_orders' => $gasOffice->gasOrders()->count(),
            'pending_orders' => $gasOffice->gasOrders()->where('status', 'pending')->count(),
            'completed_orders' => $gasOffice->gasOrders()->where('status', 'delivered')->count(),
            'total_revenue' => $gasOffice->gasOrders()->where('status', 'delivered')->sum('total'),
        ];

        return view('admin.gas-offices.show', compact('gasOffice', 'stats'));
    }

    /**
     * عرض نموذج إنشاء مكتب غاز
     */
    public function create()
    {
        return view('admin.gas-offices.create');
    }

    /**
     * إنشاء مكتب غاز جديد
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'address' => 'required|string',
            'latitude' => 'nullable|numeric',
            'longitude' => 'nullable|numeric',
            'phone' => 'required|string',
            'email' => 'nullable|email',
            'owner_name' => 'required|string|max:255',
            'owner_email' => 'required|email|unique:users,email',
            'owner_phone' => 'required|string|unique:users,phone',
            'owner_password' => 'required|string|min:6',
            'service_areas' => 'required|array',
            'service_areas.*' => 'string',
            'opening_time' => 'nullable|date_format:H:i',
            'closing_time' => 'nullable|date_format:H:i|after:opening_time',
            'delivery_fee' => 'required|numeric|min:0',
            'delivery_time_minutes' => 'required|integer|min:1',
            'minimum_order' => 'required|numeric|min:0',
            'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
            'cover_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
        ]);

        if ($validator->fails()) {
            return redirect()->back()
                ->withErrors($validator)
                ->withInput();
        }

        try {
            // إنشاء مالك المكتب
            $owner = User::create([
                'name' => $request->owner_name,
                'email' => $request->owner_email,
                'phone' => $request->owner_phone,
                'password' => Hash::make($request->owner_password),
                'user_type' => 'gas_manager',
                'service_type' => 'gas',
                'status' => 'active',
                'is_verified' => true,
            ]);

            // إنشاء مكتب الغاز
            $data = $request->all();
            $data['owner_id'] = $owner->id;

            // رفع الصور
            if ($request->hasFile('logo')) {
                $data['logo'] = $request->file('logo')->store('gas-offices/logos', 'public');
            }

            if ($request->hasFile('cover_image')) {
                $data['cover_image'] = $request->file('cover_image')->store('gas-offices/covers', 'public');
            }

            $gasOffice = GasOffice::create($data);

            return redirect()->route('admin.gas-offices.show', $gasOffice)
                ->with('success', 'تم إنشاء مكتب الغاز بنجاح');

        } catch (\Exception $e) {
            return redirect()->back()
                ->with('error', 'حدث خطأ أثناء إنشاء مكتب الغاز: ' . $e->getMessage())
                ->withInput();
        }
    }

    /**
     * عرض نموذج تعديل مكتب غاز
     */
    public function edit(GasOffice $gasOffice)
    {
        $gasOffice->load('owner');
        return view('admin.gas-offices.edit', compact('gasOffice'));
    }

    /**
     * تحديث مكتب غاز
     */
    public function update(Request $request, GasOffice $gasOffice)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'address' => 'required|string',
            'latitude' => 'nullable|numeric',
            'longitude' => 'nullable|numeric',
            'phone' => 'required|string',
            'email' => 'nullable|email',
            'service_areas' => 'required|array',
            'service_areas.*' => 'string',
            'opening_time' => 'nullable|date_format:H:i',
            'closing_time' => 'nullable|date_format:H:i|after:opening_time',
            'delivery_fee' => 'required|numeric|min:0',
            'delivery_time_minutes' => 'required|integer|min:1',
            'minimum_order' => 'required|numeric|min:0',
            'is_active' => 'boolean',
            'is_open' => 'boolean',
            'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
            'cover_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
        ]);

        if ($validator->fails()) {
            return redirect()->back()
                ->withErrors($validator)
                ->withInput();
        }

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

            // معالجة checkboxes
            $data['is_active'] = $request->has('is_active') ? (bool)$request->is_active : false;
            $data['is_open'] = $request->has('is_open') ? (bool)$request->is_open : false;

            // معالجة service_areas
            if (isset($data['service_areas']) && is_array($data['service_areas'])) {
                $data['service_areas'] = array_filter($data['service_areas']); // إزالة القيم الفارغة
            }

            // رفع الصور الجديدة
            if ($request->hasFile('logo')) {
                // حذف الصورة القديمة
                if ($gasOffice->logo) {
                    Storage::disk('public')->delete($gasOffice->logo);
                }
                $data['logo'] = $request->file('logo')->store('gas-offices/logos', 'public');
            } else {
                // الاحتفاظ بالصورة القديمة إذا لم يتم رفع صورة جديدة
                unset($data['logo']);
            }

            if ($request->hasFile('cover_image')) {
                // حذف الصورة القديمة
                if ($gasOffice->cover_image) {
                    Storage::disk('public')->delete($gasOffice->cover_image);
                }
                $data['cover_image'] = $request->file('cover_image')->store('gas-offices/covers', 'public');
            } else {
                // الاحتفاظ بالصورة القديمة إذا لم يتم رفع صورة جديدة
                unset($data['cover_image']);
            }

            $gasOffice->update($data);

            return redirect()->route('admin.gas-offices.show', $gasOffice)
                ->with('success', 'تم تحديث مكتب الغاز بنجاح');

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

    /**
     * حذف مكتب غاز
     */
    public function destroy(GasOffice $gasOffice)
    {
        try {
            // حذف الصور
            if ($gasOffice->logo) {
                Storage::disk('public')->delete($gasOffice->logo);
            }
            if ($gasOffice->cover_image) {
                Storage::disk('public')->delete($gasOffice->cover_image);
            }

            // حذف مالك المكتب
            $gasOffice->owner->delete();

            // حذف المكتب
            $gasOffice->delete();

            return redirect()->route('admin.gas-offices.index')
                ->with('success', 'تم حذف مكتب الغاز بنجاح');

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

    /**
     * تفعيل/إلغاء تفعيل مكتب غاز
     */
    public function toggleStatus(GasOffice $gasOffice)
    {
        $gasOffice->update(['is_active' => !$gasOffice->is_active]);

        $status = $gasOffice->is_active ? 'تم تفعيل' : 'تم إلغاء تفعيل';
        
        return redirect()->back()
            ->with('success', $status . ' مكتب الغاز بنجاح');
    }

    /**
     * فتح/إغلاق مكتب غاز
     */
    public function toggleOpen(GasOffice $gasOffice)
    {
        $gasOffice->update(['is_open' => !$gasOffice->is_open]);

        $status = $gasOffice->is_open ? 'تم فتح' : 'تم إغلاق';
        
        return redirect()->back()
            ->with('success', $status . ' مكتب الغاز بنجاح');
    }

    /**
     * عرض قناني مكتب غاز
     */
    public function cylinders(GasOffice $gasOffice, Request $request)
    {
        $query = $gasOffice->gasCylinders();

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

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

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

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

        return view('admin.gas-offices.cylinders', compact('gasOffice', 'cylinders'));
    }

    /**
     * عرض طلبات مكتب غاز
     */
    public function orders(GasOffice $gasOffice, Request $request)
    {
        $query = $gasOffice->gasOrders()->with(['customer', 'driver']);

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

        // فلترة حسب التاريخ
        if ($request->has('date_from')) {
            $query->whereDate('created_at', '>=', $request->date_from);
        }

        if ($request->has('date_to')) {
            $query->whereDate('created_at', '<=', $request->date_to);
        }

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

        return view('admin.gas-offices.orders', compact('gasOffice', 'orders'));
    }

    /**
     * إحصائيات مكاتب الغاز
     */
    public function stats()
    {
        $stats = [
            'total_offices' => GasOffice::count(),
            'active_offices' => GasOffice::where('is_active', true)->count(),
            'open_offices' => GasOffice::where('is_open', true)->count(),
            'total_cylinders' => GasCylinder::count(),
            'total_orders' => GasOrder::count(),
            'pending_orders' => GasOrder::where('status', 'pending')->count(),
            'completed_orders' => GasOrder::where('status', 'delivered')->count(),
            'total_revenue' => GasOrder::where('status', 'delivered')->sum('total'),
        ];

        return view('admin.gas-offices.stats', compact('stats'));
    }

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

        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,
                'message' => 'تم تحديث المخزون بنجاح',
                'data' => [
                    'old_quantity' => $gasCylinder->stock_quantity,
                    'new_quantity' => $newQuantity,
                    'operation' => $request->operation
                ]
            ]);

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

    /**
     * تحديث حالة طلب
     */
    public function updateOrderStatus(Request $request, GasOrder $gasOrder): JsonResponse
    {
        $request->validate([
            'status' => 'required|in:pending,confirmed,preparing,picked_up,delivered,cancelled'
        ]);

        try {
            $gasOrder->update(['status' => $request->status]);

            // حساب أجر التطبيق عند التوصيل
            if ($request->status === 'delivered' && !$gasOrder->platform_fee_calculated) {
                try {
                    \App\Services\PlatformFeeService::calculateAndSaveForGasOrder($gasOrder->fresh());
                } catch (\Exception $e) {
                    \Log::error('خطأ في حساب أجر التطبيق: ' . $e->getMessage());
                }
            }

            // حساب أرباح الإحالات عند التوصيل
            if ($request->status === 'delivered') {
                try {
                    $customer = $gasOrder->customer;
                    if ($customer) {
                        // البحث عن الإحالة المرتبطة بهذا المستخدم
                        $referral = \App\Models\Referral::where('referred_id', $customer->id)
                            ->where('status', 'completed')
                            ->first();

                        if ($referral) {
                            // التحقق من عدم وجود سجل ربح سابق لهذا الطلب
                            $existingEarning = \App\Models\ReferralEarning::where('order_type', 'gas')
                                ->where('order_id', $gasOrder->id)
                                ->first();

                            if (!$existingEarning) {
                                // إنشاء سجل ربح جديد
                                \App\Models\ReferralEarning::createFromOrder(
                                    $referral,
                                    'gas',
                                    $gasOrder->id,
                                    $gasOrder->order_number,
                                    $gasOrder->total
                                );
                            }
                        }
                    }
                } catch (\Exception $e) {
                    \Log::error('خطأ في حساب أرباح الإحالات: ' . $e->getMessage());
                }
            }

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

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