<?php

namespace App\Notifications\Push\Prestador\ReforcoEducativo;

use App\Enums\ApprovalStatusEnum;
use App\Enums\PushNotificationCategoryEnum;
use App\Enums\PushNotificationTargetEnum;
use App\Models\User;
use App\Notifications\Push\BasePushNotification;
use Illuminate\Database\Eloquent\Collection;

class ReforcoEducativo2Push extends BasePushNotification
{
    public function label(): string
    {
        return 'provider_reforco_educativo_2';
    }

    public function title(): string
    {
        return 'Dica importante';
    }

    public function body(): string
    {
        return 'Pedidos Sob Medida são compartilhados. A confirmação acontece por ordem de aceite.';
    }

    public function target(): PushNotificationTargetEnum
    {
        return PushNotificationTargetEnum::PRESTADOR;
    }

    public function category(): PushNotificationCategoryEnum
    {
        return PushNotificationCategoryEnum::REFORCO_EDUCATIVO;
    }

    public function notificationCooldownDays(): int
    {
        return 42; // 6 semanas — alterna com ReforcoEducativo1
    }

    public function categoryCooldownDays(): int
    {
        return 0; // sem cooldown de categoria — os dois reforços se alternam por label
    }

    /**
     * Elegível se:
     * - Prestador aprovado
     * - O último reforço educativo recebido foi o #1 há ≥3 semanas
     */
    public function eligibleUsers(): Collection
    {
        return User::whereHas('provider', fn ($q) => $q->where('approval_status', ApprovalStatusEnum::ACCEPTED))
            ->whereHas('pushNotificationLogs', function ($query) {
                $threeWeeksAgo = now()->subWeeks(3);

                $query->where('label', 'provider_reforco_educativo_1')
                    ->where('sent_at', '<=', $threeWeeksAgo)
                    ->whereNotExists(function ($sub) use ($threeWeeksAgo) {
                        $sub->from('push_notification_logs as pnl2')
                            ->whereColumn('pnl2.user_id', 'push_notification_logs.user_id')
                            ->where('pnl2.label', 'provider_reforco_educativo_2')
                            ->where('pnl2.sent_at', '>', $threeWeeksAgo);
                    });
            })
            ->get();
    }
}
