<?php

namespace Tests\Feature\Member;

use App\Group;
use App\Member\Member;
use App\Member\Membership;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Livewire\Livewire;
use Modules\Prevention\PsPendingBlock;
use Tests\TestCase;

class PsPendingBlockTest extends TestCase
{
    use DatabaseTransactions;

    public function testItRendersContent(): void
    {
        $this->withoutExceptionHandling()->withNamiSettings(12345, 'password', 101);
        $group = Group::factory()->inNami(101)->create();

        $noPsAtAll = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Jane', 'lastname' => 'Doe']);
        $validPs = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Max', 'lastname' => 'Doe', 'ps_at' => now()->subYears(4)]);
        $validMorePs = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Joe', 'lastname' => 'Doe', 'more_ps_at' => now()->subYears(4)]);
        $invalidPs = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Mike', 'lastname' => 'Doe', 'ps_at' => now()->subYears(5)]);
        $invalidMorePs = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Nora', 'lastname' => 'Doe', 'more_ps_at' => now()->subYears(5)]);
        $inactiveMembership = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8)->ended())
            ->create(['firstname' => 'Lisa', 'lastname' => 'Doe', 'more_ps_at' => now()->subYears(5)]);
        $invalidPsButValidMorePs = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Hey', 'lastname' => 'Doe', 'ps_at' => now()->subYears(10), 'more_ps_at' => now()->subYears(3)]);
        $notALeader = Member::factory()
            ->defaults()
            ->for($group)
            ->has(Membership::factory()->in('€ Mitglied', 5, 'Wölfling', 8))
            ->create(['firstname' => 'Mae', 'lastname' => 'Doe']);

        Livewire::test(PsPendingBlock::class)
            ->assertSee('Jane Doe')
            ->assertDontSee('Max Doe')
            ->assertDontSee('Joe Doe')
            ->assertSee('Mike Doe')
            ->assertSee('Nora Doe')
            ->assertDontSee('Lisa Doe')
            ->assertDontSee('Hey Doe')
            ->assertDontSee('Mae Doe');
    }

    public function testItExcludesForeignGroups(): void
    {
        $this->withoutExceptionHandling()->withNamiSettings(12345, 'password', 101);
        Group::factory()->inNami(101)->create();
        $otherGroup = Group::factory()->inNami(55)->create();

        Member::factory()
            ->defaults()
            ->for($otherGroup)
            ->has(Membership::factory()->in('€ LeiterIn', 5, 'Wölfling', 8))
            ->create(['lastname' => 'Doe']);

        Livewire::test(PsPendingBlock::class)
            ->assertDontSee('Doe');
    }
}