<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\EmployeeImport;
use App\Services\EmployeeImportService;
use App\Support\AfterResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\StreamedResponse;

class EmployeeImportController extends Controller
{
    public function __construct(private readonly EmployeeImportService $employeeImportService) {}

    public function index()
    {
        $companyId = Auth::user()?->company_id;
        $imports = EmployeeImport::query()
            ->when($companyId, fn ($query) => $query->where('company_id', $companyId))
            ->withCount('rows')
            ->latest()
            ->paginate(10);

        return view('employees.import', compact('imports'));
    }

    public function downloadTemplate(): StreamedResponse
    {
        $headers = $this->employeeImportService->templateHeaders();
        $sampleRow = $this->employeeImportService->templateSampleRow();

        return response()->streamDownload(function () use ($headers, $sampleRow) {
            $handle = fopen('php://output', 'w');
            fputcsv($handle, $headers);
            fputcsv($handle, $sampleRow);
            fclose($handle);
        }, 'employee-import-template.csv', ['Content-Type' => 'text/csv']);
    }

    public function store(Request $request)
    {
        $actor = Auth::user();
        abort_unless($actor, 403);

        $company = $actor->company_id
            ? \App\Models\Company::with('subscriptionPlan')->find($actor->company_id)
            : null;
        if ($company && ! $company->canAddEmployees(1)) {
            return redirect()->back()->with(
                'error',
                'Employee seat limit reached for your plan ('.$company->employeeSeatLimit().'). Upgrade your plan before importing more employees.'
            );
        }

        $validated = $request->validate([
            'file' => 'required|file|mimes:csv,txt|max:5120',
        ]);

        $import = $this->employeeImportService->createImportRecord($validated['file'], $actor);
        if ($import->mode === 'queued') {
            AfterResponse::run(fn () => $this->employeeImportService->processDeferred($import->id));

            return redirect()
                ->route('employees.import.show', $import)
                ->with('success', 'Import accepted. It will be processed right after this response.');
        }

        $this->employeeImportService->process($import);

        return redirect()
            ->route('employees.import.show', $import)
            ->with('success', 'Import processed successfully.');
    }

    public function show(EmployeeImport $import)
    {
        $companyId = Auth::user()?->company_id;
        if ($companyId && (int) $import->company_id !== (int) $companyId) {
            abort(404);
        }

        $import->load(['rows' => fn ($query) => $query->orderBy('row_number')]);

        return view('employees.import-show', compact('import'));
    }
}
