<?php

namespace Tests\Feature\Commands;

use App\Jobs\Document\CreateDocument;
use App\Models\Document\Document;
use App\Notifications\Sale\Invoice as InvoiceNotification;
use App\Utilities\Date;
use Illuminate\Support\Facades\Notification;
use Tests\Feature\FeatureTestCase;

class RecurringCheckTest extends FeatureTestCase
{
    public $recurring_count;

    protected function setUp(): void
    {
        parent::setUp();

        $this->recurring_count = 7;
    }

    public function testItShouldCreateCorrectNumberOfRecurringInvoices(): void
    {
        Notification::fake();

        $this->dispatch(new CreateDocument($this->getRequest()));

        Date::setTestNow(Date::now());

        $this->artisan('recurring:check');

        $this->assertDatabaseCount('documents', $this->recurring_count + 1);

        Notification::assertSentToTimes($this->user, InvoiceNotification::class, $this->recurring_count);
    }

    public function testItShouldNotCreateAnyRecurringInvoice(): void
    {
        Notification::fake();

        $this->dispatch(new CreateDocument($this->getRequest()));

        Date::setTestNow(Date::now()->subDays($this->recurring_count + 1));

        $this->artisan('recurring:check');

        $this->assertDatabaseCount('documents', 1);

        Notification::assertNotSentTo($this->user, InvoiceNotification::class);
    }

    public function getRequest(): array
    {
        return Document::factory()->invoice()->items()->recurring()->sent()->raw([
            'issued_at' => Date::now()->subDays($this->recurring_count + 1),
            'recurring_count' => '20',
        ]);
    }
}