<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Tax;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class TaxController extends Controller
{
    public function index(): View
    {
        $taxes = Tax::orderBy('name')->get();
        return view('admin.taxes.index', compact('taxes'));
    }

    public function create(): View
    {
        return view('admin.taxes.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $data = $request->validate([
            'name' => 'required|string|max:255',
            'type' => 'required|in:single,multiple',
            'rate' => 'required_if:type,single|nullable|numeric|min:0|max:100',
            'components' => 'required_if:type,multiple|nullable|array',
            'components.*.name' => 'required_with:components|string|max:255',
            'components.*.rate' => 'required_with:components|numeric|min:0|max:100',
            'is_active' => 'nullable|boolean',
        ]);

        // Handle multiple type: calculate total rate and store components
        if ($data['type'] === 'multiple') {
            if (empty($data['components']) || !is_array($data['components'])) {
                return redirect()->back()
                    ->withInput()
                    ->with('error', 'Please add at least one tax component for multiple type.');
            }

            // Calculate total rate from components
            $totalRate = array_sum(array_column($data['components'], 'rate'));
            $data['rate'] = $totalRate;
        } else {
            // Single type: no components needed, ensure rate is set
            $data['components'] = null;
            if (!isset($data['rate']) || $data['rate'] === '' || $data['rate'] === null) {
                return redirect()->back()
                    ->withInput()
                    ->with('error', 'Tax rate is required for single type.');
            }
            // Ensure rate is a numeric value and greater than 0
            $data['rate'] = (float) $data['rate'];
            if ($data['rate'] <= 0) {
                return redirect()->back()
                    ->withInput()
                    ->with('error', 'Tax rate must be greater than 0.');
            }
        }

        // Handle is_active checkbox - hidden input sends "0", checkbox sends "1" when checked
        // When checkbox is checked, both hidden (0) and checkbox (1) are sent, checkbox value wins
        $isActive = $request->input('is_active');
        $data['is_active'] = ($isActive === '1' || $isActive === 1 || $isActive === true);

        Tax::create($data);

        return redirect()->route('admin.taxes.index')
            ->with('success', 'Tax created successfully!');
    }

    public function edit(Tax $tax): View
    {
        return view('admin.taxes.edit', compact('tax'));
    }

    public function update(Request $request, Tax $tax): RedirectResponse
    {
        $data = $request->validate([
            'name' => 'required|string|max:255',
            'type' => 'required|in:single,multiple',
            'rate' => 'required_if:type,single|nullable|numeric|min:0|max:100',
            'components' => 'required_if:type,multiple|nullable|array',
            'components.*.name' => 'required_with:components|string|max:255',
            'components.*.rate' => 'required_with:components|numeric|min:0|max:100',
            'is_active' => 'nullable|boolean',
        ]);

        // Handle multiple type: calculate total rate and store components
        if ($data['type'] === 'multiple') {
            if (empty($data['components']) || !is_array($data['components'])) {
                return redirect()->back()
                    ->withInput()
                    ->with('error', 'Please add at least one tax component for multiple type.');
            }

            // Calculate total rate from components
            $totalRate = array_sum(array_column($data['components'], 'rate'));
            $data['rate'] = $totalRate;
        } else {
            // Single type: no components needed, ensure rate is set
            $data['components'] = null;
            if (!isset($data['rate']) || $data['rate'] === '' || $data['rate'] === null) {
                return redirect()->back()
                    ->withInput()
                    ->with('error', 'Tax rate is required for single type.');
            }
            // Ensure rate is a numeric value and greater than 0
            $data['rate'] = (float) $data['rate'];
            if ($data['rate'] <= 0) {
                return redirect()->back()
                    ->withInput()
                    ->with('error', 'Tax rate must be greater than 0.');
            }
        }

        // Handle is_active checkbox - hidden input sends "0", checkbox sends "1" when checked
        // When checkbox is checked, both hidden (0) and checkbox (1) are sent, checkbox value wins
        $isActive = $request->input('is_active');
        $data['is_active'] = ($isActive === '1' || $isActive === 1 || $isActive === true);

        $tax->update($data);

        return redirect()->route('admin.taxes.index')
            ->with('success', 'Tax updated successfully!');
    }

    public function destroy(Tax $tax): RedirectResponse
    {
        // Check if tax is being used by any products
        if ($tax->products()->count() > 0) {
            return redirect()->route('admin.taxes.index')
                ->with('error', 'Cannot delete tax. It is being used by ' . $tax->products()->count() . ' product(s).');
        }

        $tax->delete();

        return redirect()->route('admin.taxes.index')
            ->with('success', 'Tax deleted successfully!');
    }
}
