<?php
namespace App\SuperAdmin\Http\Controllers\Api;

use App\Http\Controllers\ApiBaseController;
use App\Models\IncomeTaxPlan;
use App\SuperAdmin\Http\Requests\Api\IncomeTaxPlan\IndexRequest;
use App\SuperAdmin\Http\Requests\Api\IncomeTaxPlan\StoreRequest;
use App\SuperAdmin\Http\Requests\Api\IncomeTaxPlan\UpdateRequest;
use App\SuperAdmin\Http\Requests\Api\IncomeTaxPlan\DeleteRequest;
use App\Models\TaxSlab;

class IncomeTaxPlanController extends ApiBaseController
{
    protected $model = IncomeTaxPlan::class;

    protected $indexRequest  = IndexRequest::class;
    protected $storeRequest  = StoreRequest::class;
    protected $updateRequest = UpdateRequest::class;
    protected $deleteRequest = DeleteRequest::class;

    protected function stored(IncomeTaxPlan $plan)
    {
        $this->syncTaxSlabs($plan);
    }

    protected function updated(IncomeTaxPlan $plan)
    {
        $this->syncTaxSlabs($plan);
    }

    /**
     * Sync tax slab records with the payload from request.
     */
    private function syncTaxSlabs(IncomeTaxPlan $plan): void
    {
        if (!request()->has('tax_slabs')) {
            return;
        }

        $payload = collect(request()->input('tax_slabs', []))
            ->filter(function ($slab) {
                return isset($slab['min_amount']) && isset($slab['tax_rate']);
            })
            ->values()
            ->map(function ($slab, $index) use ($plan) {
                return [
                    'plan_id'    => $plan->id,
                    'slab_no'    => $slab['slab_no'] ?? ($index + 1),
                    'min_amount' => $slab['min_amount'],
                    'max_amount' => $slab['max_amount'] ?? null,
                    'tax_rate'   => $slab['tax_rate'],
                    'cess_rate'  => $slab['cess_rate'] ?? 4.00,
                    'created_at' => now(),
                    'updated_at' => now(),
                ];
            });

        $plan->taxSlabs()->delete();

        if ($payload->isNotEmpty()) {
            TaxSlab::insert($payload->toArray());
        }
    }
}
