<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\SavedReport;
use App\Services\Reports\ReportCatalog;
use App\Services\Reports\SavedReportRunner;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SavedReportController extends Controller
{
    public function __construct(
        protected ReportCatalog $catalog,
        protected SavedReportRunner $runner
    ) {}

    public function index()
    {
        $reports = SavedReport::with('creator')
            ->when(Auth::user()?->company_id, fn ($q) => $q->where('company_id', Auth::user()->company_id))
            ->orderByDesc('created_at')
            ->paginate(20);

        $catalog = $this->catalog->availableForUser(Auth::user());

        return view('reports.saved', compact('reports', 'catalog'));
    }

    public function store(Request $request)
    {
        abort_unless(Auth::user()?->hasPermission('view_reports'), 403);

        $validated = $request->validate([
            'name' => 'required|string|max:191',
            'report_key' => 'required|string|max:80',
            'filters' => 'nullable|array',
            'schedule_frequency' => 'nullable|in:daily,weekly,monthly',
        ]);

        SavedReport::create([
            'company_id' => Auth::user()->company_id,
            'user_id' => Auth::id(),
            'name' => $validated['name'],
            'report_key' => $validated['report_key'],
            'filters' => $validated['filters'] ?? [],
            'schedule_frequency' => $validated['schedule_frequency'] ?? null,
            'is_active' => true,
        ]);

        return redirect()->route('reports.saved.index')->with('success', 'Report saved.');
    }

    public function run(SavedReport $savedReport)
    {
        abort_unless(Auth::user()?->hasPermission('view_reports'), 403);
        $this->assertTenant($savedReport);

        $savedReport->update(['last_run_at' => now()]);

        return $this->runner->run($savedReport, Auth::user());
    }

    public function destroy(SavedReport $savedReport)
    {
        abort_unless(Auth::user()?->hasPermission('view_reports'), 403);
        $this->assertTenant($savedReport);
        $savedReport->delete();

        return redirect()->route('reports.saved.index')->with('success', 'Saved report deleted.');
    }

    protected function assertTenant(SavedReport $report): void
    {
        $companyId = Auth::user()?->company_id;
        if ($companyId && (int) $report->company_id !== (int) $companyId) {
            abort(403);
        }
    }
}
