<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Jobs\ProcessEmployeeImportJob;
use App\Models\EmployeeImport;
use App\Services\EmployeeImportService;
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 = [
            'John Doe',
            'john.doe@example.com',
            'password123',
            '',
            '9876543210',
            'male',
            '1995-08-15',
            'Robert Doe',
            '2026-04-01',
            'Engineering',
            'Senior Developer',
            'Head Office',
            '',
            '',
            'employee@example.com',
            '650000',
            'John Doe',
            'ABC Bank',
            '1234567890',
            'Main Branch',
            'Bengaluru',
            'ABCD0123456',
            'ABCDE1234F',
            '100200300400',
            '2026-04-01',
            'Karnataka',
            'Bengaluru',
            '',
        ];

        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);

        $validated = $request->validate([
            'file' => 'required|file|mimes:csv,txt|max:5120',
        ]);

        $import = $this->employeeImportService->createImportRecord($validated['file'], $actor);
        if ($import->mode === 'queued') {
            ProcessEmployeeImportJob::dispatch($import->id);

            return redirect()
                ->route('employees.import.show', $import)
                ->with('success', 'Import queued. It will be processed in background.');
        }

        $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'));
    }
}
