<?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 ReforcoEducativo1Push extends BasePushNotification
{
    public function label(): string
    {
        return 'provider_reforco_educativo_1';
    }

    public function title(): string
    {
        return 'Como funcionam os pedidos Sob Medida';
    }

    public function body(): string
    {
        return 'Eles são enviados para várias diaristas ao mesmo tempo. Aceite rápido para garantir.';
    }

    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 ReforcoEducativo2
    }

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

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

                $query->whereDoesntHave('pushNotificationLogs', fn ($q) => $q->whereIn('label', [
                    'provider_reforco_educativo_1',
                    'provider_reforco_educativo_2',
                ]))
                    ->orWhereHas('pushNotificationLogs', function ($q) use ($threeWeeksAgo) {
                        $q->where('label', 'provider_reforco_educativo_2')
                            ->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_1')
                                    ->where('pnl2.sent_at', '>', $threeWeeksAgo);
                            });
                    });
            })
            ->get();
    }
}
