<?php

namespace Modules\SaaS\Http\Controllers\Api\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\SubscriptionPlan;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class SubscriptionPlanController extends Controller
{
    public function index(Request $request): JsonResponse
    {
        $plans = SubscriptionPlan::when($request->active, fn ($q) => $q->where('active', 1))
            ->orderBy('position')
            ->paginate($request->input('per_page', 20));
        return response()->json($plans);
    }

    public function store(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'description' => 'nullable|string|max:1000',
            'base_price_monthly' => 'required|numeric|min:0',
            'base_price_yearly' => 'required|numeric|min:0',
            'per_employee_price' => 'required|numeric|min:0',
            'employee_limit' => 'nullable|integer|min:1',
            'billing_type' => 'required|in:monthly,yearly,lifetime',
            'modules' => 'nullable|array',
            'default' => 'in:yes,no,trial',
            'is_popular' => 'boolean',
            'active' => 'boolean',
        ]);
        $validated['active'] = $validated['active'] ?? true;
        $plan = SubscriptionPlan::create($validated);
        return response()->json($plan, 201);
    }

    public function show(SubscriptionPlan $subscription_plan): JsonResponse
    {
        return response()->json($subscription_plan);
    }

    public function update(Request $request, SubscriptionPlan $subscription_plan): JsonResponse
    {
        $subscription_plan->update($request->validate([
            'name' => 'sometimes|string|max:255',
            'description' => 'nullable|string|max:1000',
            'base_price_monthly' => 'sometimes|numeric|min:0',
            'base_price_yearly' => 'sometimes|numeric|min:0',
            'per_employee_price' => 'sometimes|numeric|min:0',
            'employee_limit' => 'nullable|integer|min:1',
            'billing_type' => 'sometimes|in:monthly,yearly,lifetime',
            'modules' => 'nullable|array',
            'active' => 'boolean',
        ]));
        return response()->json($subscription_plan->fresh());
    }

    public function destroy(SubscriptionPlan $subscription_plan): JsonResponse
    {
        if ($subscription_plan->default === 'yes') {
            return response()->json(['message' => 'Default plan cannot be deleted.'], 422);
        }
        $subscription_plan->delete();
        return response()->json(null, 204);
    }
}
