<?php

namespace predictionio\tests\Unit;


use predictionio\Exporter;

class TestExporter {
    use Exporter {
        jsonEncode as traitJsonEncode;
    }

    public $json;
    public $data;

    public function __construct() {
        $this->json = [];
        $this->data = [];
    }

    public function jsonEncode($data) {
        $this->data[] = $data;
        return $this->traitJsonEncode($data);
    }

    public function export($json) {
        $this->json[] = $json;
    }
}

class ExporterTest extends \PHPUnit_Framework_TestCase {

    /** @var TestExporter $exporter */
    private $exporter;

    protected function setUp() {
        $this->exporter = new TestExporter();
    }

    public function testTimeIsNow() {
        $time = new \DateTime();

        $this->exporter->createEvent('event', 'entity-type', 'entity-id');

        $this->assertEquals(1, count($this->exporter->data));
        $data = $this->exporter->data[0];
        $this->assertEquals(4, count($data));
        $this->assertEquals('event', $data['event']);
        $this->assertEquals('entity-type', $data['entityType']);
        $this->assertEquals('entity-id', $data['entityId']);
        $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is now', 1);

        $this->assertEquals(1, count($this->exporter->json));
        $json = $this->exporter->json[0];
        $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}"}$/';
        $this->assertTrue(preg_match($pattern, $json) === 1, 'json');
    }

    public function testTimeIsString() {
        $time = new \DateTime('2015-04-01');

        $this->exporter->createEvent('event', 'entity-type', 'entity-id', null, null, null, '2015-04-01');

        $this->assertEquals(1, count($this->exporter->data));
        $data = $this->exporter->data[0];
        $this->assertEquals(4, count($data));
        $this->assertEquals('event', $data['event']);
        $this->assertEquals('entity-type', $data['entityType']);
        $this->assertEquals('entity-id', $data['entityId']);
        $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is string', 1);

        $this->assertEquals(1, count($this->exporter->json));
        $json = $this->exporter->json[0];
        $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}"}$/';
        $this->assertTrue(preg_match($pattern, $json) === 1, 'json');
    }

    public function testTimeIsDateTime() {
        $time = new \DateTime('2015-04-01');

        $this->exporter->createEvent('event', 'entity-type', 'entity-id', null, null, null, $time);

        $this->assertEquals(1, count($this->exporter->data));
        $data = $this->exporter->data[0];
        $this->assertEquals(4, count($data));
        $this->assertEquals('event', $data['event']);
        $this->assertEquals('entity-type', $data['entityType']);
        $this->assertEquals('entity-id', $data['entityId']);
        $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is DateTime', 1);

        $this->assertEquals(1, count($this->exporter->json));
        $json = $this->exporter->json[0];
        $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}"}$/';
        $this->assertTrue(preg_match($pattern, $json) === 1, 'json');
    }

    public function testOptionalFields() {
        $time = new \DateTime('2015-04-01');

        $this->exporter->createEvent('event', 'entity-type', 'entity-id',
            'target-entity-type', 'target-entity-id', ['property' => true], $time);

        $this->assertEquals(1, count($this->exporter->data));
        $data = $this->exporter->data[0];
        $this->assertEquals(7, count($data));
        $this->assertEquals('event', $data['event']);
        $this->assertEquals('entity-type', $data['entityType']);
        $this->assertEquals('entity-id', $data['entityId']);
        $this->assertEquals($time->format(\DateTime::ISO8601), $data['eventTime'], 'time is DateTime', 1);
        $this->assertEquals('target-entity-type', $data['targetEntityType']);
        $this->assertEquals('target-entity-id', $data['targetEntityId']);
        $this->assertEquals(['property'=>true], $data['properties']);

        $this->assertEquals(1, count($this->exporter->json));
        $json = $this->exporter->json[0];
        $pattern = '/^{"event":"event","entityType":"entity-type","entityId":"entity-id","eventTime":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}","targetEntityType":"target-entity-type","targetEntityId":"target-entity-id","properties":{"property":true}}$/';
        $this->assertTrue(preg_match($pattern, $json) === 1, 'json');
    }

}