<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\OtpCode;
use App\Models\User;
use Illuminate\Http\Request;

class OtpCodeController extends Controller
{
    /**
     * نمایش لیست کدهای فعالسازی با امکان جستجو و فیلتر
     */
    public function index(Request $request)
    {
        $query = OtpCode::with('user')->latest('created_at');

        // ── جستجو ──────────────────────────────────────────────────────────────
        if ($search = $request->input('search')) {
            $query->where(function ($q) use ($search) {
                $q->where('phone', 'like', "%{$search}%")
                  ->orWhere('email', 'like', "%{$search}%")
                  ->orWhere('code', 'like', "%{$search}%");
            });
        }

        // ── فیلتر نوع ──────────────────────────────────────────────────────────
        if ($type = $request->input('type')) {
            $query->where('type', $type);
        }

        // ── فیلتر وضعیت ────────────────────────────────────────────────────────
        if ($status = $request->input('status')) {
            match ($status) {
                'active'  => $query->active(),
                'expired' => $query->expired(),
                'used'    => $query->used(),
                default   => null,
            };
        }

        $otpCodes = $query->paginate(30)->withQueryString();

        // آمار سریع
        $stats = [
            'total'   => OtpCode::count(),
            'active'  => OtpCode::active()->count(),
            'expired' => OtpCode::expired()->count(),
            'used'    => OtpCode::used()->count(),
        ];

        return view('admin.otp_codes.index', compact('otpCodes', 'stats'));
    }

    /**
     * تولید کد فعالسازی جدید برای یک کاربر توسط ادمین
     */
    public function generate(Request $request)
    {
        $request->validate([
            'phone_or_email' => 'required|string',
            'type'           => 'required|in:register,login,reset_password,verify_phone,verify_email',
        ]);

        $contact = $request->input('phone_or_email');
        $type    = $request->input('type');

        // پیدا کردن کاربر
        $user = User::where('phone', $contact)
                    ->orWhere('email', $contact)
                    ->first();

        if (! $user) {
            return back()->with('error', 'کاربری با این شماره/ایمیل یافت نشد.');
        }

        // غیرفعال کردن کدهای قبلی
        OtpCode::where('user_id', $user->id)
               ->where('type', $type)
               ->where('verified', false)
               ->update(['expires_at' => now()->subSecond()]);

        // ساخت کد جدید
        $code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);

        OtpCode::create([
            'user_id'    => $user->id,
            'email'      => $user->email,
            'phone'      => $user->phone,
            'code'       => $code,
            'type'       => $type,
            'expires_at' => now()->addMinutes(30),  // برای کد ادمین ۳۰ دقیقه
            'verified'   => false,
            'ip_address' => $request->ip(),
            'created_at' => now(),
        ]);

        return back()->with('success', "کد فعالسازی {$code} برای {$contact} ساخته شد.");
    }

    /**
     * تمدید مدت اعتبار یک کد
     */
    public function extend(OtpCode $otpCode)
    {
        if ($otpCode->verified) {
            return back()->with('error', 'این کد قبلاً استفاده شده و قابل تمدید نیست.');
        }

        $otpCode->update(['expires_at' => now()->addMinutes(30)]);

        return back()->with('success', "مدت اعتبار کد {$otpCode->code} تا ۳۰ دقیقه دیگر تمدید شد.");
    }

    /**
     * حذف کدهای منقضی و استفاده‌شده
     */
    public function cleanup()
    {
        $count = OtpCode::where(function ($q) {
            $q->where('verified', true)
              ->orWhere('expires_at', '<=', now()->subDay());
        })->delete();

        return back()->with('success', "{$count} کد قدیمی پاک‌سازی شد.");
    }
}
