<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\SubscriptionCoupon;
use App\Models\SubscriptionPlan;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class CouponController extends Controller
{
    public function index()
    {
        $coupons = SubscriptionCoupon::query()->orderByDesc('id')->paginate(20);

        return view('superadmin.coupons.index', compact('coupons'));
    }

    public function create()
    {
        $plans = SubscriptionPlan::query()->where('active', true)->orderBy('position')->get();

        return view('superadmin.coupons.create', compact('plans'));
    }

    public function store(Request $request)
    {
        $data = $this->validated($request);
        $data['code'] = strtoupper($data['code']);
        $data['is_active'] = $request->boolean('is_active', true);
        $data['applies_to_plan_ids'] = $data['applies_to_plan_ids'] ?? null;

        SubscriptionCoupon::create($data);

        return redirect()->route('superadmin.coupons.index')->with('success', 'Coupon created.');
    }

    public function edit(SubscriptionCoupon $coupon)
    {
        $plans = SubscriptionPlan::query()->where('active', true)->orderBy('position')->get();

        return view('superadmin.coupons.edit', compact('coupon', 'plans'));
    }

    public function update(Request $request, SubscriptionCoupon $coupon)
    {
        $data = $this->validated($request, $coupon->id);
        $data['code'] = strtoupper($data['code']);
        $data['is_active'] = $request->boolean('is_active');
        $data['applies_to_plan_ids'] = $data['applies_to_plan_ids'] ?? null;

        $coupon->update($data);

        return redirect()->route('superadmin.coupons.index')->with('success', 'Coupon updated.');
    }

    public function destroy(SubscriptionCoupon $coupon)
    {
        $coupon->delete();

        return redirect()->route('superadmin.coupons.index')->with('success', 'Coupon deleted.');
    }

    public function toggleActive(SubscriptionCoupon $coupon)
    {
        $coupon->update(['is_active' => ! $coupon->is_active]);

        return redirect()->route('superadmin.coupons.index')
            ->with('success', 'Coupon marked as '.($coupon->is_active ? 'active' : 'inactive').'.');
    }

    private function validated(Request $request, ?int $ignoreId = null): array
    {
        return $request->validate([
            'code' => [
                'required',
                'string',
                'max:64',
                Rule::unique('subscription_coupons', 'code')->ignore($ignoreId),
            ],
            'name' => 'nullable|string|max:191',
            'discount_type' => ['required', Rule::in(['percent', 'fixed'])],
            'discount_value' => 'required|numeric|min:0.01',
            'max_uses' => 'nullable|integer|min:1',
            'max_uses_per_company' => 'nullable|integer|min:1',
            'valid_from' => 'nullable|date',
            'valid_until' => 'nullable|date|after_or_equal:valid_from',
            'applies_to_plan_ids' => 'nullable|array',
            'applies_to_plan_ids.*' => 'integer|exists:subscription_plans,id',
            'min_amount' => 'nullable|numeric|min:0',
            'is_active' => 'sometimes|boolean',
        ]);
    }
}
