<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\IncomeTaxPlan;
use App\Models\TaxSlab;
use Illuminate\Http\Request;

class IncomeTaxPlanController extends Controller
{
    public function index()
    {
        $plans = IncomeTaxPlan::withCount('taxSlabs')->orderBy('plan_code')->get();
        return view('superadmin.income-tax-plans.index', compact('plans'));
    }

    public function create()
    {
        return view('superadmin.income-tax-plans.create');
    }

    public function store(Request $request)
    {
        $data = $request->validate([
            'plan_name' => 'required|string|max:100',
            'plan_code' => 'required|string|max:50',
            'allow_deductions' => 'required|boolean',
            'standard_deduction' => 'required|numeric|min:0',
            'description' => 'nullable|string',
            'effective_from' => 'required|date',
            'effective_to' => 'required|date|after_or_equal:effective_from',
            'is_active' => 'required|boolean',
            'tax_slabs' => 'required|array|min:1',
            'tax_slabs.*.slab_no' => 'nullable|integer|min:1',
            'tax_slabs.*.min_amount' => 'required|numeric|min:0',
            'tax_slabs.*.max_amount' => 'nullable|numeric|min:0',
            'tax_slabs.*.tax_rate' => 'required|numeric|min:0|max:100',
            'tax_slabs.*.cess_rate' => 'nullable|numeric|min:0|max:100',
        ]);

        $plan = IncomeTaxPlan::create([
            'plan_name' => $data['plan_name'],
            'plan_code' => $data['plan_code'],
            'allow_deductions' => (bool) $data['allow_deductions'],
            'standard_deduction' => $data['standard_deduction'],
            'description' => $data['description'] ?? null,
            'effective_from' => $data['effective_from'],
            'effective_to' => $data['effective_to'],
            'is_active' => (bool) $data['is_active'],
        ]);

        $this->syncTaxSlabs($plan, $data['tax_slabs']);

        return redirect()->route('superadmin.income-tax-plans.index')->with('success', 'Income tax plan saved.');
    }

    public function edit(IncomeTaxPlan $incomeTaxPlan)
    {
        $incomeTaxPlan->load('taxSlabs');
        return view('superadmin.income-tax-plans.edit', compact('incomeTaxPlan'));
    }

    public function update(Request $request, IncomeTaxPlan $incomeTaxPlan)
    {
        $data = $request->validate([
            'plan_name' => 'required|string|max:100',
            'plan_code' => 'required|string|max:50',
            'allow_deductions' => 'required|boolean',
            'standard_deduction' => 'required|numeric|min:0',
            'description' => 'nullable|string',
            'effective_from' => 'required|date',
            'effective_to' => 'required|date|after_or_equal:effective_from',
            'is_active' => 'required|boolean',
            'tax_slabs' => 'required|array|min:1',
            'tax_slabs.*.slab_no' => 'nullable|integer|min:1',
            'tax_slabs.*.min_amount' => 'required|numeric|min:0',
            'tax_slabs.*.max_amount' => 'nullable|numeric|min:0',
            'tax_slabs.*.tax_rate' => 'required|numeric|min:0|max:100',
            'tax_slabs.*.cess_rate' => 'nullable|numeric|min:0|max:100',
        ]);

        $incomeTaxPlan->update([
            'plan_name' => $data['plan_name'],
            'plan_code' => $data['plan_code'],
            'allow_deductions' => (bool) $data['allow_deductions'],
            'standard_deduction' => $data['standard_deduction'],
            'description' => $data['description'] ?? null,
            'effective_from' => $data['effective_from'],
            'effective_to' => $data['effective_to'],
            'is_active' => (bool) $data['is_active'],
        ]);

        $this->syncTaxSlabs($incomeTaxPlan, $data['tax_slabs']);

        return redirect()->route('superadmin.income-tax-plans.index')->with('success', 'Income tax plan updated.');
    }

    public function destroy(IncomeTaxPlan $incomeTaxPlan)
    {
        $incomeTaxPlan->delete();
        return redirect()->route('superadmin.income-tax-plans.index')->with('success', 'Plan deleted.');
    }

    private function syncTaxSlabs(IncomeTaxPlan $plan, array $slabs): void
    {
        $plan->taxSlabs()->delete();

        $rows = collect($slabs)
            ->filter(fn ($s) => isset($s['min_amount'], $s['tax_rate']))
            ->values()
            ->map(function ($s, $i) use ($plan) {
                return [
                    'plan_id' => $plan->id,
                    'slab_no' => $s['slab_no'] ?? ($i + 1),
                    'min_amount' => $s['min_amount'],
                    'max_amount' => $s['max_amount'] ?? null,
                    'tax_rate' => $s['tax_rate'],
                    'cess_rate' => $s['cess_rate'] ?? 4.00,
                    'created_at' => now(),
                    'updated_at' => now(),
                ];
            });

        if ($rows->isNotEmpty()) {
            TaxSlab::insert($rows->toArray());
        }
    }
}
