<?php

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

beforeEach(function (): void {
    config([
        'services.stripe.prices.basic.monthly' => 'price_test_basic_monthly',
        'services.stripe.prices.basic.annual' => 'price_test_basic_annual',
        'services.stripe.prices.plus.monthly' => 'price_test_plus_monthly',
        'services.stripe.prices.plus.annual' => 'price_test_plus_annual',
        'services.stripe.prices.pro.monthly' => null,
        'services.stripe.prices.pro.annual' => null,
    ]);
});

it('requires authentication for the checkout route', function (): void {
    $this->get('/billing/checkout/basic/monthly')->assertRedirect('/login');
});

it('requires authentication for the portal route', function (): void {
    $this->get('/billing/portal')->assertRedirect('/login');
});

it('rejects an unknown tier', function (): void {
    $this->actingAs(User::factory()->create())
        ->get('/billing/checkout/titanium/monthly')
        ->assertNotFound();
});

it('rejects an unknown cadence', function (): void {
    $this->actingAs(User::factory()->create())
        ->get('/billing/checkout/basic/weekly')
        ->assertNotFound();
});

it('returns 404 when no price is configured for the tier + cadence', function (): void {
    $this->actingAs(User::factory()->create())
        ->get('/billing/checkout/pro/monthly')
        ->assertNotFound();
});

it('redirects the success route to the dashboard', function (): void {
    $this->actingAs(User::factory()->create())
        ->get('/billing/success')
        ->assertRedirect(route('dashboard'))
        ->assertSessionHas('status', 'subscription_started');
});

it('redirects the cancel route to the dashboard', function (): void {
    $this->actingAs(User::factory()->create())
        ->get('/billing/cancel')
        ->assertRedirect(route('dashboard'))
        ->assertSessionHas('status', 'subscription_cancelled');
});
