<?php

declare(strict_types=1);

use App\Mail\SuspiciousLoginNotification;
use App\Models\Tenant;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;

uses(DatabaseTransactions::class);

beforeEach(function () {
    Mail::fake();

    $this->tenant = Tenant::factory()->create();
    $this->user = User::factory()->create([
        'tenant_id' => $this->tenant->id,
        'email' => 'suspicious@example.ru',
        'password_hash' => Hash::make('right-password'),
    ]);
});

test('после 3-й неудачной попытки отправляется SuspiciousLoginNotification', function () {
    for ($i = 1; $i <= 2; $i++) {
        $this->postJson('/api/auth/login', [
            'email' => 'suspicious@example.ru',
            'password' => 'wrong-pass-attempt',
        ])->assertStatus(422);
    }

    Mail::assertNothingSent();

    // 3-я неудача → триггер email.
    $this->postJson('/api/auth/login', [
        'email' => 'suspicious@example.ru',
        'password' => 'wrong-pass-attempt',
    ])->assertStatus(422);

    Mail::assertSent(SuspiciousLoginNotification::class, function ($mail) {
        return $mail->user->email === 'suspicious@example.ru'
            && $mail->failedAttemptsCount === 3
            && $mail->hasTo('suspicious@example.ru');
    });
});

test('на 4-й и 5-й неудачных попытках email НЕ дублируется', function () {
    // Накапливаем 3 fail и проверяем 1 sent.
    for ($i = 1; $i <= 3; $i++) {
        $this->postJson('/api/auth/login', [
            'email' => 'suspicious@example.ru',
            'password' => 'wrong-pass-attempt',
        ])->assertStatus(422);
    }
    Mail::assertSent(SuspiciousLoginNotification::class, 1);

    // 4-я и 5-я — НЕ должны слать дополнительное письмо.
    for ($i = 4; $i <= 5; $i++) {
        $this->postJson('/api/auth/login', [
            'email' => 'suspicious@example.ru',
            'password' => 'wrong-pass-attempt',
        ])->assertStatus(422);
    }
    Mail::assertSent(SuspiciousLoginNotification::class, 1); // всё ещё один.
});

test('для unknown email НЕ отправляется (некому)', function () {
    for ($i = 1; $i <= 4; $i++) {
        $this->postJson('/api/auth/login', [
            'email' => 'nobody-existing@example.ru',
            'password' => 'wrong-pass-attempt',
        ])->assertStatus(422);
    }

    Mail::assertNothingSent();
});

test('успешный вход после 1-2 неудач НЕ триггерит email (счётчик login_failed=2)', function () {
    for ($i = 1; $i <= 2; $i++) {
        $this->postJson('/api/auth/login', [
            'email' => 'suspicious@example.ru',
            'password' => 'wrong-pass-attempt',
        ])->assertStatus(422);
    }

    $this->postJson('/api/auth/login', [
        'email' => 'suspicious@example.ru',
        'password' => 'right-password',
    ])->assertOk();

    Mail::assertNothingSent();
});
