<?php

namespace App\Filament\Tenant\Pages;

use App\Models\Tenant\Client;
use App\Models\Tenant\Vehicle;
use App\Models\Tenant\WorkOrder;
use Filament\Pages\Page;

class Recommendations extends Page
{
    protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-light-bulb';

    protected static ?string $navigationLabel = 'Recomandări';

    protected static string|\UnitEnum|null $navigationGroup = 'Analiză';

    protected static ?int $navigationSort = 72;

    protected static ?string $title = 'Recomandări — clienți de urmărit';

    protected string $view = 'filament.tenant.pages.recommendations';

    public function lostClients(): \Illuminate\Support\Collection
    {
        // Clients with no WO in last 6 months and previously >= 1 visit.
        $cutoff = now()->subMonths(6);
        return Client::with(['workOrders' => fn ($q) => $q->latest('opened_at')->limit(1)])
            ->whereHas('workOrders', fn ($q) => $q->where('opened_at', '<', $cutoff))
            ->whereDoesntHave('workOrders', fn ($q) => $q->where('opened_at', '>=', $cutoff))
            ->where('status', '!=', 'lost')
            ->limit(30)
            ->get();
    }

    public function highMileageVehicles(): \Illuminate\Support\Collection
    {
        return Vehicle::with('client')
            ->where('mileage', '>', 100000)
            ->orderByDesc('mileage')
            ->limit(20)
            ->get();
    }

    public function unpaidWO(): \Illuminate\Support\Collection
    {
        return WorkOrder::with(['client', 'vehicle'])
            ->where('pay_status', '!=', 'paid')
            ->whereNotIn('status', ['cancelled'])
            ->where('total', '>', 0)
            ->orderByDesc('opened_at')
            ->limit(30)
            ->get();
    }

    public function vipNeedingTouchup(): \Illuminate\Support\Collection
    {
        // VIP clients with no contact in 30+ days.
        return Client::where('status', 'vip')
            ->where(fn ($q) => $q->whereNull('last_contact_at')->orWhere('last_contact_at', '<', now()->subDays(30)))
            ->limit(20)
            ->get();
    }
}
