<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\FoodOrder;
use App\Models\FoodOrderItem;
use App\Models\MenuItem;
use App\Models\Restaurant;
use App\Models\User;
use Carbon\Carbon;

class OrdersOnlySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $this->command->info('🍕 بدء إنشاء بيانات الطلبات فقط...');
        
        // حذف الطلبات الموجودة
        FoodOrder::truncate();
        FoodOrderItem::truncate();
        
        // التأكد من وجود مطاعم وعملاء
        $restaurants = Restaurant::all();
        $customers = User::where('user_type', 'passenger')->get();
        
        if ($restaurants->isEmpty() || $customers->isEmpty()) {
            $this->command->error('❌ يجب إنشاء مطاعم وعملاء أولاً');
            return;
        }

        // إنشاء طلبات متنوعة
        $this->createOrders($restaurants, $customers);
        
        $this->command->info('✅ تم إنشاء بيانات الطلبات بنجاح!');
    }

    private function createOrders($restaurants, $customers)
    {
        $statuses = [
            'pending' => 8,      // طلبات معلقة
            'confirmed' => 5,    // طلبات مؤكدة
            'preparing' => 4,    // طلبات قيد التحضير
            'ready' => 3,        // طلبات جاهزة
            'completed' => 12,   // طلبات مكتملة
            'rejected' => 3,     // طلبات مرفوضة
        ];

        foreach ($statuses as $status => $count) {
            for ($i = 0; $i < $count; $i++) {
                $this->createOrder($restaurants, $customers, $status);
            }
        }
    }

    private function createOrder($restaurants, $customers, $status)
    {
        $restaurant = $restaurants->random();
        $customer = $customers->random();
        $menuItems = MenuItem::where('restaurant_id', $restaurant->id)->get();
        
        if ($menuItems->isEmpty()) return;

        $order = FoodOrder::create([
            'restaurant_id' => $restaurant->id,
            'customer_id' => $customer->id,
            'order_number' => 'ORD-' . str_pad(rand(1000, 9999), 4, '0', STR_PAD_LEFT),
            'subtotal' => 0,
            'delivery_fee' => 2000,
            'tax' => 0,
            'total' => 0,
            'delivery_address' => $this->getRandomAddress(),
            'delivery_latitude' => 33.3152 + (rand(-100, 100) / 10000),
            'delivery_longitude' => 44.3661 + (rand(-100, 100) / 10000),
            'status' => $status,
            'payment_method' => $this->getRandomPaymentMethod(),
            'payment_status' => $this->getPaymentStatus($status),
            'special_instructions' => $this->getRandomInstructions(),
            'created_at' => $this->getCreatedAt($status),
            'actual_delivery_time' => $status === 'completed' ? Carbon::now()->subHours(rand(1, 24)) : null,
            'customer_rating' => $status === 'completed' ? rand(3, 5) : null,
            'customer_feedback' => $status === 'completed' ? $this->getRandomFeedback() : null,
        ]);

        $this->createOrderItems($order, $menuItems);
        $this->updateOrderTotal($order);
    }

    private function createOrderItems($order, $menuItems)
    {
        $itemCount = rand(1, 4);
        $selectedItems = $menuItems->random(min($itemCount, $menuItems->count()));
        
        foreach ($selectedItems as $menuItem) {
            $quantity = rand(1, 3);
            FoodOrderItem::create([
                'food_order_id' => $order->id,
                'menu_item_id' => $menuItem->id,
                'quantity' => $quantity,
                'unit_price' => $menuItem->price,
                'total_price' => $menuItem->price * $quantity,
            ]);
        }
    }

    private function updateOrderTotal($order)
    {
        $subtotal = $order->orderItems->sum('total_price');
        $tax = $subtotal * 0.1; // 10% ضريبة
        $total = $subtotal + $order->delivery_fee + $tax;

        $order->update([
            'subtotal' => $subtotal,
            'tax' => $tax,
            'total' => $total,
        ]);
    }

    private function getPaymentStatus($status)
    {
        return match($status) {
            'pending' => 'pending',
            'confirmed', 'preparing', 'ready', 'completed' => 'paid',
            'rejected' => 'refunded',
            default => 'pending'
        };
    }

    private function getCreatedAt($status)
    {
        return match($status) {
            'pending' => Carbon::now()->subMinutes(rand(5, 60)),
            'confirmed' => Carbon::now()->subMinutes(rand(30, 120)),
            'preparing' => Carbon::now()->subMinutes(rand(60, 180)),
            'ready' => Carbon::now()->subMinutes(rand(120, 240)),
            'completed' => Carbon::now()->subHours(rand(2, 48)),
            'rejected' => Carbon::now()->subHours(rand(1, 12)),
            default => Carbon::now()
        };
    }

    private function getRandomAddress()
    {
        $addresses = [
            'شارع الرشيد، بغداد',
            'الكرادة، بغداد',
            'الجادرية، بغداد',
            'المنصور، بغداد',
            'البياع، بغداد',
            'الزعفرانية، بغداد',
            'الحرية، بغداد',
            'الكرخ، بغداد',
            'الجامعة، بغداد',
            'الوزيرية، بغداد',
        ];
        
        return $addresses[array_rand($addresses)];
    }

    private function getRandomPaymentMethod()
    {
        $methods = ['cash', 'card', 'online'];
        return $methods[array_rand($methods)];
    }

    private function getRandomInstructions()
    {
        $instructions = [
            'يرجى عدم إضافة ملح كثير',
            'يرجى تسليم الطلب للبواب',
            'يرجى الاتصال عند الوصول',
            'الطابق الثالث، الشقة 15',
            'يرجى إضافة صلصة حارة',
            'يرجى عدم إضافة بصل',
            'يرجى تسليم الطلب في البوابة الرئيسية',
            'يرجى عدم إضافة طماطم',
            null,
            null,
        ];
        
        return $instructions[array_rand($instructions)];
    }

    private function getRandomFeedback()
    {
        $feedbacks = [
            'الطعام كان لذيذ جداً، شكراً لكم',
            'التوصيل كان سريع والطعام ساخن',
            'خدمة ممتازة، سأطلب مرة أخرى',
            'الطعام جيد لكن التوصيل تأخر قليلاً',
            'ممتاز، أنصح الجميع بهذا المطعم',
            'الطعام لذيذ والتوصيل سريع',
            'خدمة جيدة، شكراً لكم',
            'الطعام كان ساخن ولذيذ',
            'التوصيل كان في الوقت المحدد',
            'الطعام طازج والخدمة ممتازة',
        ];
        
        return $feedbacks[array_rand($feedbacks)];
    }
}
