<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\DiscountCode;
use App\Models\Product;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class DiscountCodeController extends Controller
{
    public function index()
    {
        $codes = DiscountCode::with('user')->latest()->get();
        return view('admin.discount-codes.index', compact('codes'));
    }

    public function create()
    {
        $products          = Product::select('id', 'title')->where('is_active', true)->orderBy('title')->get();
        $users             = User::select('id', 'first_name', 'last_name', 'mobile')->where('role', '!=', 'admin')->orderBy('first_name')->get();
        $selectedProductIds = old('product_ids', []);
        return view('admin.discount-codes.form', compact('products', 'users', 'selectedProductIds'));
    }

    public function store(Request $request)
    {
        $data = $this->validateCode($request);

        $code = DiscountCode::create($data);

        if ($data['scope'] === 'products') {
            $code->products()->sync((array) $request->input('product_ids', []));
        }

        return redirect()->route('admin.discount-codes.index')
            ->with('success', 'کد تخفیف با موفقیت ایجاد شد.');
    }

    public function edit(DiscountCode $discountCode)
    {
        $products           = Product::select('id', 'title')->where('is_active', true)->orderBy('title')->get();
        $users              = User::select('id', 'first_name', 'last_name', 'mobile')->where('role', '!=', 'admin')->orderBy('first_name')->get();
        $selectedProductIds = old('product_ids', $discountCode->products()->pluck('products.id')->toArray());
        return view('admin.discount-codes.form', compact('discountCode', 'products', 'users', 'selectedProductIds'));
    }

    public function update(Request $request, DiscountCode $discountCode)
    {
        $data = $this->validateCode($request, $discountCode);

        $discountCode->update($data);

        if ($data['scope'] === 'products') {
            $discountCode->products()->sync((array) $request->input('product_ids', []));
        } else {
            $discountCode->products()->detach();
        }

        return redirect()->route('admin.discount-codes.index')
            ->with('success', 'کد تخفیف ویرایش شد.');
    }

    public function destroy(DiscountCode $discountCode)
    {
        $discountCode->delete();
        return back()->with('success', 'کد تخفیف حذف شد.');
    }

    public function toggle(DiscountCode $discountCode)
    {
        $discountCode->update(['is_active' => !$discountCode->is_active]);
        return back()->with('success', 'وضعیت کد تخفیف تغییر کرد.');
    }

    // ── Private ───────────────────────────────────────────────────────────────

    private function toLatinDigits(string $val): string
    {
        $from = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹','٠','١','٢','٣','٤','٥','٦','٧','٨','٩'];
        $to   = ['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9'];
        return str_replace($from, $to, $val);
    }

    private function validateCode(Request $request, ?DiscountCode $existing = null): array
    {
        $request->merge([
            'starts_at'  => $this->toLatinDigits($request->input('starts_at') ?? ''),
            'expires_at' => $this->toLatinDigits($request->input('expires_at') ?? ''),
        ]);

        $codeRule = $existing
            ? ['required', 'string', 'max:50', 'alpha_dash', Rule::unique('discount_codes', 'code')->ignore($existing->id)]
            : ['required', 'string', 'max:50', 'alpha_dash', 'unique:discount_codes,code'];

        $valueRules = ['required', 'integer', 'min:1'];
        if ($request->type === 'percent') {
            $valueRules[] = 'max:100';
        }

        $validated = $request->validate([
            'code'         => $codeRule,
            'type'         => 'required|in:percent,fixed',
            'value'        => $valueRules,
            'scope'        => 'required|in:all,products,user',
            'product_ids'  => 'required_if:scope,products|array',
            'product_ids.*'=> 'exists:products,id',
            'user_id'      => 'required_if:scope,user|nullable|exists:users,id',
            'min_order'         => 'nullable|integer|min:0',
            'max_uses'          => 'nullable|integer|min:1',
            'max_uses_per_user' => 'nullable|integer|min:1',
            'starts_at'    => ['nullable', 'regex:/^\d{4}\/\d{2}\/\d{2}$/'],
            'expires_at'   => ['nullable', 'regex:/^\d{4}\/\d{2}\/\d{2}$/'],
            'is_active'    => 'boolean',
        ], [
            'code.required'         => 'کد تخفیف الزامی است.',
            'code.alpha_dash'       => 'کد فقط می‌تواند شامل حروف، اعداد، خط تیره و زیرخط باشد.',
            'code.unique'           => 'این کد قبلاً استفاده شده است.',
            'value.required'        => 'مقدار تخفیف الزامی است.',
            'value.max'             => 'درصد تخفیف نمی‌تواند بیشتر از ۱۰۰ باشد.',
            'value.min'             => 'مقدار تخفیف باید بیشتر از صفر باشد.',
            'product_ids.required_if' => 'حداقل یک محصول را انتخاب کنید.',
            'user_id.required_if'   => 'انتخاب کاربر الزامی است.',
            'starts_at.regex'       => 'فرمت تاریخ شروع صحیح نیست (مثال: ۱۴۰۳/۰۱/۰۱).',
            'expires_at.regex'      => 'فرمت تاریخ انقضا صحیح نیست (مثال: ۱۴۰۳/۱۲/۲۹).',
        ]);

        $validated['code']      = strtoupper($validated['code']);
        $validated['is_active'] = $request->boolean('is_active');
        $validated['user_id']   = $validated['scope'] === 'user' ? ($validated['user_id'] ?? null) : null;

        return $validated;
    }
}
