<?php

namespace Tests\Unit;

use App\Enums\PaymentAuditEvent;
use PHPUnit\Framework\TestCase;

class PaymentAuditEventTest extends TestCase
{
    public function test_all_cases_have_label(): void
    {
        foreach (PaymentAuditEvent::cases() as $case) {
            $label = $case->label();
            $this->assertNotEmpty($label, "Case {$case->value} should have a label");
            $this->assertIsString($label);
        }
    }

    public function test_all_cases_are_financial_category(): void
    {
        foreach (PaymentAuditEvent::cases() as $case) {
            $this->assertSame(
                'financial',
                $case->category(),
                "Case {$case->value} should be financial category"
            );
        }
    }

    public function test_all_cases_have_icon(): void
    {
        foreach (PaymentAuditEvent::cases() as $case) {
            $icon = $case->icon();
            $this->assertStringStartsWith('heroicon-o-', $icon, "Case {$case->value} icon must start with heroicon-o-");
        }
    }

    public function test_all_cases_have_color(): void
    {
        $validColors = ['success', 'warning', 'danger', 'info', 'gray'];

        foreach (PaymentAuditEvent::cases() as $case) {
            $color = $case->color();
            $this->assertContains(
                $color,
                $validColors,
                "Case {$case->value} has invalid color: {$color}"
            );
        }
    }

    public function test_summary_with_empty_data(): void
    {
        foreach (PaymentAuditEvent::cases() as $case) {
            $summary = $case->summary([]);
            $this->assertSame(
                $case->label(),
                $summary,
                "Case {$case->value}: summary with empty data should return only label"
            );
        }
    }

    public function test_summary_with_amount(): void
    {
        $summary = PaymentAuditEvent::CREATED->summary(['amount' => 1000]);

        $this->assertStringContainsString('Pago registrado', $summary);
        $this->assertStringContainsString('Monto:', $summary);
    }

    public function test_summary_with_credit_and_installment(): void
    {
        $summary = PaymentAuditEvent::REVERSED->summary([
            'amount' => 500,
            'credit_id' => 123,
            'installment_id' => 5,
        ]);

        $this->assertStringContainsString('Pago reversado', $summary);
        $this->assertStringContainsString('Crédito #123', $summary);
        $this->assertStringContainsString('Cuota #5', $summary);
    }

    public function test_summary_does_not_invent_data(): void
    {
        $summary = PaymentAuditEvent::CREATED->summary(['unknown' => 'value']);
        $this->assertSame('Pago registrado', $summary);
    }

    public function test_created_is_success(): void
    {
        $this->assertSame('success', PaymentAuditEvent::CREATED->color());
    }

    public function test_reversed_is_danger(): void
    {
        $this->assertSame('danger', PaymentAuditEvent::REVERSED->color());
    }
}
