<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\SubscriptionPlan;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class PlanController extends Controller
{
    public function index()
    {
        $plans = SubscriptionPlan::withCount('companies')
            ->orderBy('base_price_yearly')
            ->orderBy('name')
            ->get();

        return view('superadmin.plans.index', compact('plans'));
    }

    public function create()
    {
        return view('superadmin.plans.create');
    }

    public function store(Request $request)
    {
        $data = $this->validated($request);
        $data['active'] = $request->boolean('active');
        $data['is_popular'] = $request->boolean('is_popular');
        $data['is_custom'] = $request->boolean('is_custom');
        $data['billing_type'] = 'yearly';
        $data['base_price_monthly'] = $data['base_price_monthly'] ?? 0;
        $data['per_employee_price'] = $data['per_employee_price'] ?? 0;
        $data['currency_code'] = $data['currency_code'] ?? 'INR';
        $data['currency_symbol'] = $data['currency_symbol'] ?? '₹';
        $data['discount_type'] = $data['discount_type'] ?? 'none';
        $data['discount_value'] = $data['discount_value'] ?? 0;

        $plan = SubscriptionPlan::create($data);
        // Full product access for every plan — clear legacy feature/addon gates.
        $plan->planFeatures()->delete();
        $plan->addons()->sync([]);

        return redirect()->route('superadmin.plans.index')->with('success', 'Plan created successfully.');
    }

    public function edit(SubscriptionPlan $plan)
    {
        return view('superadmin.plans.edit', compact('plan'));
    }

    public function update(Request $request, SubscriptionPlan $plan)
    {
        $data = $this->validated($request);
        $data['active'] = $request->boolean('active');
        $data['is_popular'] = $request->boolean('is_popular');
        $data['is_custom'] = $request->boolean('is_custom');
        $data['billing_type'] = 'yearly';
        $data['base_price_monthly'] = $data['base_price_monthly'] ?? 0;
        $data['per_employee_price'] = $data['per_employee_price'] ?? 0;
        $data['currency_code'] = $data['currency_code'] ?? 'INR';
        $data['currency_symbol'] = $data['currency_symbol'] ?? '₹';
        $data['discount_type'] = $data['discount_type'] ?? 'none';
        $data['discount_value'] = $data['discount_value'] ?? 0;

        $plan->update($data);
        $plan->planFeatures()->delete();
        $plan->addons()->sync([]);

        return redirect()->route('superadmin.plans.index')->with('success', 'Plan updated successfully.');
    }

    public function destroy(SubscriptionPlan $plan)
    {
        if ($plan->companies()->count() > 0) {
            return redirect()->route('superadmin.plans.index')
                ->with('error', 'Cannot delete plan: it has tenants assigned. Reassign or remove tenants first.');
        }
        $plan->delete();

        return redirect()->route('superadmin.plans.index')->with('success', 'Plan deleted successfully.');
    }

    public function toggleActive(SubscriptionPlan $plan)
    {
        $plan->update(['active' => ! $plan->active]);

        return redirect()->route('superadmin.plans.index')
            ->with('success', 'Plan marked as '.($plan->active ? 'active' : 'inactive').'.');
    }

    private function validated(Request $request): array
    {
        return $request->validate([
            'name' => 'required|string|max:255',
            'description' => 'nullable|string|max:1000',
            'base_price_yearly' => 'required|numeric|min:0',
            'base_price_monthly' => 'nullable|numeric|min:0',
            'per_employee_price' => 'nullable|numeric|min:0',
            'employee_limit' => 'nullable|integer|min:1',
            'discount_type' => ['nullable', Rule::in(['none', 'percent', 'fixed'])],
            'discount_value' => 'nullable|numeric|min:0',
            'strike_price_yearly' => 'nullable|numeric|min:0',
            'is_custom' => 'sometimes|boolean',
            'active' => 'sometimes|boolean',
            'is_popular' => 'sometimes|boolean',
            'currency_code' => 'nullable|string|max:10',
            'currency_symbol' => 'nullable|string|max:10',
            'position' => 'nullable|integer|min:0',
        ]);
    }
}
