<?php

declare(strict_types=1);

namespace Modules\{{ Module }}\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Modules\{{ Module }}\Contracts\{{ Entity }}RepositoryInterface;
use Modules\{{ Module }}\Contracts\{{ Entity }}ServiceInterface;
use Modules\{{ Module }}\DTOs\{{ Entity }}Data;
use Modules\{{ Module }}\Http\Requests\Store{{ Entity }}Request;
use Modules\{{ Module }}\Http\Requests\Update{{ Entity }}Request;
use Modules\{{ Module }}\Models\{{ Entity }};

/**
 * Coordination only.
 *
 * Resolve dependencies, map the validated request to a DTO, call one service
 * method, return a response. No conditionals on business state, no Eloquent, no
 * transactions — the architecture tests fail the build if any of those appear.
 */
final class {{ Entity }}Controller extends Controller
{
    public function __construct(
        private readonly {{ Entity }}ServiceInterface $service,
        private readonly {{ Entity }}RepositoryInterface $repository,
    ) {}

    public function index(Request $request): View
    {
        $this->authorize('viewAny', {{ Entity }}::class);

        return view('{{ key }}::index', [
            'records' => $this->repository->paginate(
                (int) $request->integer('per_page', (int) config('clinic.pagination.default')),
            ),
        ]);
    }

    public function create(): View
    {
        $this->authorize('create', {{ Entity }}::class);

        return view('{{ key }}::create');
    }

    public function store(Store{{ Entity }}Request $request): RedirectResponse
    {
        ${{ entity }} = $this->service->create({{ Entity }}Data::fromStoreRequest($request));

        return redirect()
            ->route('{{ key }}.show', ${{ entity }})
            ->with('status', __('{{ key }}::messages.created'));
    }

    public function show({{ Entity }} ${{ entity }}): View
    {
        $this->authorize('view', ${{ entity }});

        return view('{{ key }}::show', ['record' => ${{ entity }}]);
    }

    public function edit({{ Entity }} ${{ entity }}): View
    {
        $this->authorize('update', ${{ entity }});

        return view('{{ key }}::edit', ['record' => ${{ entity }}]);
    }

    public function update(Update{{ Entity }}Request $request, {{ Entity }} ${{ entity }}): RedirectResponse
    {
        $this->service->update(${{ entity }}, {{ Entity }}Data::fromUpdateRequest($request));

        return redirect()
            ->route('{{ key }}.show', ${{ entity }})
            ->with('status', __('{{ key }}::messages.updated'));
    }

    public function destroy({{ Entity }} ${{ entity }}): RedirectResponse
    {
        $this->authorize('delete', ${{ entity }});

        $this->service->delete(${{ entity }});

        return redirect()
            ->route('{{ key }}.index')
            ->with('status', __('{{ key }}::messages.deleted'));
    }
}
