<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Referral;
use App\Models\PointReward;
use App\Models\PointRedemption;
use App\Models\PointSetting;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class PointsController extends Controller
{
    /**
     * Get user's points and referral info
     */
    public function getPointsInfo()
    {
        try {
            $user = Auth::user();
            $points = $user->getOrCreatePoints();
            
            // إحصائيات الإحالات
            $referralStats = [
                'total_referrals' => $user->referrals()->count(),
                'completed_referrals' => $user->referrals()->where('status', 'completed')->count(),
                'pending_referrals' => $user->referrals()->where('status', 'pending')->count(),
                'total_points_earned' => $user->referrals()->where('status', 'completed')->sum('points_earned'),
            ];

            // آخر الإحالات
            $recentReferrals = $user->referrals()
                ->with('referred')
                ->latest()
                ->limit(5)
                ->get();

            // آخر المعاملات
            $recentTransactions = $user->pointTransactions()
                ->latest()
                ->limit(10)
                ->get();

            return response()->json([
                'success' => true,
                'data' => [
                    'points' => [
                        'total' => $points->points,
                        'available' => $points->available_points,
                        'used' => $points->used_points,
                    ],
                    'referral_stats' => $referralStats,
                    'recent_referrals' => $recentReferrals,
                    'recent_transactions' => $recentTransactions,
                ],
                'message' => 'تم جلب معلومات النقاط بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

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

    /**
     * Generate referral code for user
     */
    public function generateReferralCode()
    {
        try {
            $user = Auth::user();
            
            // التحقق من وجود كود دعوة نشط
            $existingReferral = $user->referrals()
                ->where('status', 'pending')
                ->where('expires_at', '>', now())
                ->first();

            if ($existingReferral) {
                return response()->json([
                    'success' => true,
                    'data' => [
                        'referral_code' => $existingReferral->referral_code,
                        'expires_at' => $existingReferral->expires_at,
                        'qr_code_url' => $this->generateQRCodeUrl($existingReferral->referral_code),
                    ],
                    'message' => 'تم جلب كود الدعوة الموجود'
                ], 200, [], JSON_UNESCAPED_UNICODE);
            }

            // إنشاء كود دعوة جديد
            $referralCode = Referral::generateReferralCode();
            
            // إنشاء إحالة مؤقتة (بدون referred_id)
            $referral = Referral::create([
                'referrer_id' => $user->id,
                'referred_id' => null, // سيتم تحديثه عند التسجيل
                'referral_code' => $referralCode,
                'status' => 'pending',
                'points_earned' => $this->getReferralPoints(),
                'expires_at' => now()->addDays(30), // صالح لمدة 30 يوم
            ]);

            return response()->json([
                'success' => true,
                'data' => [
                    'referral_code' => $referralCode,
                    'expires_at' => $referral->expires_at,
                    'qr_code_url' => $this->generateQRCodeUrl($referralCode),
                ],
                'message' => 'تم إنشاء كود الدعوة بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

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

    /**
     * Use referral code
     */
    public function useReferralCode(Request $request)
    {
        try {
            $request->validate([
                'referral_code' => 'required|string|exists:referrals,referral_code'
            ]);

            $user = Auth::user();
            $referralCode = $request->referral_code;

            // التحقق من صحة الكود
            $referral = Referral::where('referral_code', $referralCode)
                ->where('status', 'pending')
                ->where('expires_at', '>', now())
                ->first();

            if (!$referral) {
                return response()->json([
                    'success' => false,
                    'message' => 'كود الدعوة غير صالح أو منتهي الصلاحية'
                ], 400);
            }

            // التحقق من أن المستخدم لا يستخدم كود نفسه
            if ($referral->referrer_id == $user->id) {
                return response()->json([
                    'success' => false,
                    'message' => 'لا يمكنك استخدام كود الدعوة الخاص بك'
                ], 400);
            }

            // التحقق من أن المستخدم لم يستخدم كود دعوة من قبل
            if ($user->referredBy()->exists()) {
                return response()->json([
                    'success' => false,
                    'message' => 'لقد استخدمت كود دعوة من قبل'
                ], 400);
            }

            DB::beginTransaction();

            try {
                // تحديث الإحالة
                $referral->update([
                    'referred_id' => $user->id,
                    'status' => 'completed',
                    'completed_at' => now(),
                ]);

                // إضافة النقاط للمستخدم الذي دعا
                $referrer = $referral->referrer;
                $referrer->addPoints(
                    $referral->points_earned,
                    'referral',
                    'دعوة صديق',
                    [
                        'referral_id' => $referral->id,
                        'referred_user' => $user->name,
                    ]
                );

                // إضافة نقاط ترحيب للمستخدم الجديد
                $welcomePoints = $this->getWelcomePoints();
                $user->addPoints(
                    $welcomePoints,
                    'welcome',
                    'نقاط ترحيب',
                    [
                        'referral_code' => $referralCode,
                    ]
                );

                DB::commit();

                return response()->json([
                    'success' => true,
                    'data' => [
                        'points_earned' => $welcomePoints,
                        'referrer_name' => $referrer->name,
                    ],
                    'message' => 'تم استخدام كود الدعوة بنجاح! حصلت على ' . $welcomePoints . ' نقطة ترحيب'
                ], 200, [], JSON_UNESCAPED_UNICODE);

            } catch (\Exception $e) {
                DB::rollBack();
                throw $e;
            }

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطأ في استخدام كود الدعوة: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Get available rewards
     */
    public function getRewards()
    {
        try {
            $rewards = PointReward::where('is_active', true)
                ->where(function($query) {
                    $query->whereNull('valid_from')
                          ->orWhere('valid_from', '<=', now());
                })
                ->where(function($query) {
                    $query->whereNull('valid_until')
                          ->orWhere('valid_until', '>=', now());
                })
                ->orderBy('points_required')
                ->get();

            return response()->json([
                'success' => true,
                'data' => $rewards,
                'message' => 'تم جلب المكافآت بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطأ في جلب المكافآت: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Redeem reward
     */
    public function redeemReward(Request $request)
    {
        try {
            $request->validate([
                'reward_id' => 'required|exists:point_rewards,id'
            ]);

            $user = Auth::user();
            $reward = PointReward::findOrFail($request->reward_id);

            // التحقق من إمكانية الاسترداد
            if (!$reward->canBeRedeemed()) {
                return response()->json([
                    'success' => false,
                    'message' => 'هذه المكافأة غير متاحة للاسترداد حالياً'
                ], 400);
            }

            // التحقق من النقاط المتاحة
            $userPoints = $user->getOrCreatePoints();
            if ($userPoints->available_points < $reward->points_required) {
                return response()->json([
                    'success' => false,
                    'message' => 'نقاط غير كافية. تحتاج إلى ' . $reward->points_required . ' نقطة'
                ], 400);
            }

            DB::beginTransaction();

            try {
                // إنشاء طلب الاسترداد
                $redemption = PointRedemption::create([
                    'user_id' => $user->id,
                    'reward_id' => $reward->id,
                    'points_used' => $reward->points_required,
                    'status' => 'pending',
                    'redemption_code' => PointRedemption::generateRedemptionCode(),
                ]);

                // استخدام النقاط
                $user->usePoints(
                    $reward->points_required,
                    'استرداد مكافأة: ' . $reward->name_ar,
                    [
                        'reward_id' => $reward->id,
                        'redemption_id' => $redemption->id,
                    ]
                );

                DB::commit();

                return response()->json([
                    'success' => true,
                    'data' => [
                        'redemption_code' => $redemption->redemption_code,
                        'points_used' => $reward->points_required,
                        'reward_name' => $reward->name_ar,
                    ],
                    'message' => 'تم طلب الاسترداد بنجاح. سيتم مراجعته قريباً'
                ], 200, [], JSON_UNESCAPED_UNICODE);

            } catch (\Exception $e) {
                DB::rollBack();
                throw $e;
            }

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطأ في طلب الاسترداد: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Get user's redemptions
     */
    public function getRedemptions()
    {
        try {
            $user = Auth::user();
            $redemptions = $user->redemptions()
                ->with('reward')
                ->latest()
                ->get();

            return response()->json([
                'success' => true,
                'data' => $redemptions,
                'message' => 'تم جلب طلبات الاسترداد بنجاح'
            ], 200, [], JSON_UNESCAPED_UNICODE);

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

    /**
     * Get referral points setting
     */
    private function getReferralPoints()
    {
        $setting = PointSetting::where('key', 'referral_points')->first();
        return $setting ? (int)$setting->value : 10; // 10 نقاط افتراضياً
    }

    /**
     * Get welcome points setting
     */
    private function getWelcomePoints()
    {
        $setting = PointSetting::where('key', 'welcome_points')->first();
        return $setting ? (int)$setting->value : 5; // 5 نقاط افتراضياً
    }

    /**
     * Generate QR code URL
     */
    private function generateQRCodeUrl($referralCode)
    {
        $appUrl = config('app.url');
        $referralUrl = $appUrl . '/register?ref=' . $referralCode;
        
        // يمكن استخدام خدمة QR Code مثل qr-server.com
        return 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=' . urlencode($referralUrl);
    }
}
