<?php

namespace App\Tests\Entity;

use App\Entity\Advert;
use App\Entity\AdvertPayment;
use App\Entity\OrderNumber;
use PHPUnit\Framework\TestCase;

class AdvertPaymentTest extends TestCase
{
    private function createAdvert(): Advert
    {
        $order = new OrderNumber('04/2026-99001');

        return new Advert($order, 'test-secret');
    }

    public function testConstructor(): void
    {
        $advert = $this->createAdvert();
        $payment = new AdvertPayment($advert, AdvertPayment::TYPE_SUCCESS, '199.00');

        $this->assertNull($payment->getId());
        $this->assertSame($advert, $payment->getAdvert());
        $this->assertSame(AdvertPayment::TYPE_SUCCESS, $payment->getType());
        $this->assertSame('199.00', $payment->getAmount());
        $this->assertNull($payment->getMethod());
        $this->assertInstanceOf(\DateTimeImmutable::class, $payment->getCreatedAt());
    }

    public function testTypeRefused(): void
    {
        $advert = $this->createAdvert();
        $payment = new AdvertPayment($advert, AdvertPayment::TYPE_REFUSED, '0.00');

        $this->assertSame(AdvertPayment::TYPE_REFUSED, $payment->getType());
    }

    public function testMethod(): void
    {
        $advert = $this->createAdvert();
        $payment = new AdvertPayment($advert, AdvertPayment::TYPE_SUCCESS, '50.00');

        $this->assertNull($payment->getMethod());

        $payment->setMethod('card');
        $this->assertSame('card', $payment->getMethod());

        $payment->setMethod(null);
        $this->assertNull($payment->getMethod());
    }

    public function testMethodReturnsStatic(): void
    {
        $advert = $this->createAdvert();
        $payment = new AdvertPayment($advert, AdvertPayment::TYPE_SUCCESS, '50.00');

        $result = $payment->setMethod('sepa');
        $this->assertSame($payment, $result);
    }

    public function testTypeConstants(): void
    {
        $this->assertSame('success', AdvertPayment::TYPE_SUCCESS);
        $this->assertSame('refused', AdvertPayment::TYPE_REFUSED);
    }

    public function testCreatedAtIsImmutable(): void
    {
        $advert = $this->createAdvert();
        $before = new \DateTimeImmutable();
        $payment = new AdvertPayment($advert, AdvertPayment::TYPE_SUCCESS, '99.00');
        $after = new \DateTimeImmutable();

        $this->assertGreaterThanOrEqual($before, $payment->getCreatedAt());
        $this->assertLessThanOrEqual($after, $payment->getCreatedAt());
    }
}
