<?php

namespace App\Tests\Entity;

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

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

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

    public function testConstructorMinimalArgs(): void
    {
        $advert = $this->createAdvert();
        $event = new AdvertEvent($advert, AdvertEvent::TYPE_VIEW);

        $this->assertNull($event->getId());
        $this->assertSame($advert, $event->getAdvert());
        $this->assertSame(AdvertEvent::TYPE_VIEW, $event->getType());
        $this->assertNull($event->getDetails());
        $this->assertNull($event->getIp());
        $this->assertInstanceOf(\DateTimeImmutable::class, $event->getCreatedAt());
    }

    public function testConstructorWithAllArgs(): void
    {
        $advert = $this->createAdvert();
        $event = new AdvertEvent($advert, AdvertEvent::TYPE_PAY, 'Paiement CB', '192.168.1.1');

        $this->assertSame(AdvertEvent::TYPE_PAY, $event->getType());
        $this->assertSame('Paiement CB', $event->getDetails());
        $this->assertSame('192.168.1.1', $event->getIp());
    }

    public function testTypeConstants(): void
    {
        $this->assertSame('view', AdvertEvent::TYPE_VIEW);
        $this->assertSame('pay', AdvertEvent::TYPE_PAY);
        $this->assertSame('mail_open', AdvertEvent::TYPE_MAIL_OPEN);
        $this->assertSame('mail_send', AdvertEvent::TYPE_MAIL_SEND);
        $this->assertSame('reminder', AdvertEvent::TYPE_REMINDER);
    }

    public function testGetTypeLabelView(): void
    {
        $event = new AdvertEvent($this->createAdvert(), AdvertEvent::TYPE_VIEW);
        $this->assertSame('Page consultee', $event->getTypeLabel());
    }

    public function testGetTypeLabelPay(): void
    {
        $event = new AdvertEvent($this->createAdvert(), AdvertEvent::TYPE_PAY);
        $this->assertSame('Paiement effectue', $event->getTypeLabel());
    }

    public function testGetTypeLabelMailOpen(): void
    {
        $event = new AdvertEvent($this->createAdvert(), AdvertEvent::TYPE_MAIL_OPEN);
        $this->assertSame('Email ouvert', $event->getTypeLabel());
    }

    public function testGetTypeLabelMailSend(): void
    {
        $event = new AdvertEvent($this->createAdvert(), AdvertEvent::TYPE_MAIL_SEND);
        $this->assertSame('Email envoye', $event->getTypeLabel());
    }

    public function testGetTypeLabelReminder(): void
    {
        $event = new AdvertEvent($this->createAdvert(), AdvertEvent::TYPE_REMINDER);
        $this->assertSame('Relance envoyee', $event->getTypeLabel());
    }

    public function testGetTypeLabelUnknown(): void
    {
        $event = new AdvertEvent($this->createAdvert(), 'custom_type');
        $this->assertSame('custom_type', $event->getTypeLabel());
    }

    public function testCreatedAtTimestamp(): void
    {
        $advert = $this->createAdvert();
        $before = new \DateTimeImmutable();
        $event = new AdvertEvent($advert, AdvertEvent::TYPE_VIEW);
        $after = new \DateTimeImmutable();

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