<?php

namespace App\Services;

use App\Models\FoodOrder;
use App\Models\GasOrder;
use App\Models\PartnerWalletTransaction;
use App\Models\PlatformFee;
use App\Services\PartnerWalletService;
use Illuminate\Support\Facades\DB;

class PlatformFeeService
{
    // الحد الأدنى للأجر
    const MIN_FEE = 400;
    
    // الحد الأقصى للأجر
    const MAX_FEE = 800;
    
    // القيمة الحدية لتطبيق النسبة
    const THRESHOLD = 10000;
    
    // النسبة المئوية للقيمة الزائدة (4%)
    const PERCENTAGE = 0.04;

    /**
     * حساب أجر التطبيق بناءً على قيمة الطلب
     * 
     * القواعد:
     * - إذا كانت قيمة الطلب < 10,000: الأجر = 400 دينار
     * - إذا كانت قيمة الطلب >= 10,000: الأجر = 400 + (القيمة الزائدة × 4%)
     * - الحد الأقصى للأجر = 800 دينار
     */
    public static function calculateFee($orderTotal)
    {
        $orderTotal = (float) $orderTotal;
        
        if ($orderTotal < self::THRESHOLD) {
            // أقل من 10,000: 400 دينار
            return [
                'fee' => self::MIN_FEE,
                'percentage' => null,
                'calculation' => 'قيمة ثابتة (أقل من 10,000 دينار)'
            ];
        } else {
            // أكثر من 10,000: 400 + نسبة
            $excess = $orderTotal - self::THRESHOLD;
            $percentageFee = $excess * self::PERCENTAGE;
            $totalFee = self::MIN_FEE + $percentageFee;
            
            // التأكد من عدم تجاوز الحد الأقصى
            if ($totalFee > self::MAX_FEE) {
                return [
                    'fee' => self::MAX_FEE,
                    'percentage' => self::PERCENTAGE,
                    'calculation' => "400 + (الزائد × 4%) - محدود بحد أقصى 800 دينار"
                ];
            }
            
            return [
                'fee' => $totalFee,
                'percentage' => self::PERCENTAGE,
                'calculation' => "400 + ({$excess} × 4%)"
            ];
        }
    }

    /**
     * حساب وحفظ أجر التطبيق لطلب طعام
     */
    public static function calculateAndSaveForFoodOrder(FoodOrder $order)
    {
        if ($order->platform_fee_calculated) {
            return PlatformFee::where('order_type', 'food')
                              ->where('order_id', $order->id)
                              ->first();
        }

        $feeCalculation = self::calculateFee($order->total);
        
        // تحديث الطلب
        $order->update([
            'platform_fee' => $feeCalculation['fee'],
            'platform_fee_calculated' => true,
        ]);

        // إنشاء سجل في جدول platform_fees
        $platformFee = PlatformFee::create([
            'order_type' => 'food',
            'order_id' => $order->id,
            'order_number' => $order->order_number,
            'service_provider_id' => $order->restaurant_id,
            'service_provider_type' => 'restaurant',
            'order_total' => $order->total,
            'platform_fee' => $feeCalculation['fee'],
            'fee_percentage' => $feeCalculation['percentage'],
            'status' => 'pending',
        ]);

        // استقطاع رسوم التطبيق من محفظة المطعم (الرصيد يمكن أن يصبح سالباً - ماينص)
        try {
            PartnerWalletService::deductForOrder(
                'restaurant',
                (int) $order->restaurant_id,
                (float) $feeCalculation['fee'],
                PartnerWalletTransaction::REFERENCE_FOOD_ORDER,
                (int) $order->id,
                $order->order_number,
                'رسوم تطبيق - طلبية طعام #' . $order->order_number
            );
        } catch (\Throwable $e) {
            \Log::error('Partner wallet deduction failed for food order: ' . $e->getMessage());
        }

        return $platformFee;
    }

    /**
     * حساب وحفظ أجر التطبيق لطلب غاز
     */
    public static function calculateAndSaveForGasOrder(GasOrder $order)
    {
        if ($order->platform_fee_calculated) {
            return PlatformFee::where('order_type', 'gas')
                              ->where('order_id', $order->id)
                              ->first();
        }

        $feeCalculation = self::calculateFee($order->total);
        
        // تحديث الطلب
        $order->update([
            'platform_fee' => $feeCalculation['fee'],
            'platform_fee_calculated' => true,
        ]);

        // إنشاء سجل في جدول platform_fees
        $platformFee = PlatformFee::create([
            'order_type' => 'gas',
            'order_id' => $order->id,
            'order_number' => $order->order_number,
            'service_provider_id' => $order->gas_office_id,
            'service_provider_type' => 'gas_office',
            'order_total' => $order->total,
            'platform_fee' => $feeCalculation['fee'],
            'fee_percentage' => $feeCalculation['percentage'],
            'status' => 'pending',
        ]);

        // استقطاع رسوم التطبيق من محفظة مكتب الغاز (الرصيد يمكن أن يصبح سالباً - ماينص)
        try {
            PartnerWalletService::deductForOrder(
                'gas_office',
                (int) $order->gas_office_id,
                (float) $feeCalculation['fee'],
                PartnerWalletTransaction::REFERENCE_GAS_ORDER,
                (int) $order->id,
                $order->order_number,
                'رسوم تطبيق - طلبية غاز #' . $order->order_number
            );
        } catch (\Throwable $e) {
            \Log::error('Partner wallet deduction failed for gas order: ' . $e->getMessage());
        }

        return $platformFee;
    }

    /**
     * حساب إجمالي الأجور لمقدم خدمة
     */
    public static function getProviderFees($providerId, $providerType, $startDate = null, $endDate = null)
    {
        $query = PlatformFee::where('service_provider_id', $providerId)
                            ->where('service_provider_type', $providerType);

        if ($startDate) {
            $query->whereDate('created_at', '>=', $startDate);
        }

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

        return [
            'total_fees' => $query->sum('platform_fee'),
            'total_orders' => $query->count(),
            'pending_fees' => (clone $query)->where('status', 'pending')->sum('platform_fee'),
            'collected_fees' => (clone $query)->where('status', 'collected')->sum('platform_fee'),
            'paid_fees' => (clone $query)->where('status', 'paid')->sum('platform_fee'),
        ];
    }

    /**
     * حساب إجمالي الأجور اليومية
     */
    public static function getDailyFees($providerId = null, $providerType = null)
    {
        $query = PlatformFee::whereDate('created_at', today());

        if ($providerId && $providerType) {
            $query->where('service_provider_id', $providerId)
                  ->where('service_provider_type', $providerType);
        }

        return [
            'total' => $query->sum('platform_fee'),
            'orders_count' => $query->count(),
        ];
    }

    /**
     * حساب إجمالي الأجور الشهرية
     */
    public static function getMonthlyFees($providerId = null, $providerType = null)
    {
        $query = PlatformFee::whereMonth('created_at', now()->month)
                            ->whereYear('created_at', now()->year);

        if ($providerId && $providerType) {
            $query->where('service_provider_id', $providerId)
                  ->where('service_provider_type', $providerType);
        }

        return [
            'total' => $query->sum('platform_fee'),
            'orders_count' => $query->count(),
        ];
    }

    /**
     * حساب إجمالي الأجور السنوية
     */
    public static function getYearlyFees($providerId = null, $providerType = null)
    {
        $query = PlatformFee::whereYear('created_at', now()->year);

        if ($providerId && $providerType) {
            $query->where('service_provider_id', $providerId)
                  ->where('service_provider_type', $providerType);
        }

        return [
            'total' => $query->sum('platform_fee'),
            'orders_count' => $query->count(),
        ];
    }
}
