<?php

namespace clagiordano\weblibs\configmanager\tests;

use clagiordano\weblibs\configmanager\ArrayConfigManager;
use clagiordano\weblibs\configmanager\FileConverter;
use clagiordano\weblibs\configmanager\YamlConfigManager;
use PHPUnit\Framework\TestCase;

/**
 * Class FileConverterTest
 * @package clagiordano\weblibs\configmanager\tests
 */
class FileConverterTest extends TestCase
{
    /**
     * @return array
     */
    public function configDataProvider()
    {
        return [
            [
              __DIR__ . '/../testsdata/sample_config_data.php',
              '\clagiordano\weblibs\configmanager\ArrayConfigManager',
              __DIR__ . '/../testsdata/sample_config_data.php.converted.yml',
              '\clagiordano\weblibs\configmanager\YamlConfigManager',
            ],
            [
                __DIR__ . '/../testsdata/sample_config_data.php',
                '\clagiordano\weblibs\configmanager\ArrayConfigManager',
                __DIR__ . '/../testsdata/sample_config_data.php.converted.json',
                '\clagiordano\weblibs\configmanager\JsonConfigManager',
            ],
            [
                __DIR__ . '/../testsdata/sample_config_data.yml',
                '\clagiordano\weblibs\configmanager\YamlConfigManager',
                __DIR__ . '/../testsdata/sample_config_data.yml.converted.json',
                '\clagiordano\weblibs\configmanager\JsonConfigManager',
            ],
            [
                __DIR__ . '/../testsdata/sample_config_data.yml',
                '\clagiordano\weblibs\configmanager\YamlConfigManager',
                __DIR__ . '/../testsdata/sample_config_data.yml.converted.php',
                '\clagiordano\weblibs\configmanager\ArrayConfigManager',
            ],
            [
                __DIR__ . '/../testsdata/sample_config_data.json',
                '\clagiordano\weblibs\configmanager\JsonConfigManager',
                __DIR__ . '/../testsdata/sample_config_data.json.converted.yml',
                '\clagiordano\weblibs\configmanager\YamlConfigManager',
            ],
            [
                __DIR__ . '/../testsdata/sample_config_data.json',
                '\clagiordano\weblibs\configmanager\JsonConfigManager',
                __DIR__ . '/../testsdata/sample_config_data.json.converted.php',
                '\clagiordano\weblibs\configmanager\ArrayConfigManager',
            ],
        ];
    }

    /**
     * @test
     * @dataProvider configDataProvider
     * @param mixed $sourceConfig
     * @param mixed $sourceInstance
     * @param mixed $targetConfig
     * @param mixed $targetInstance
     */
    public function canConvertOneFormatToAnother($sourceConfig, $sourceInstance, $targetConfig, $targetInstance)
    {
        if (file_exists($targetConfig)) {
            /**
             * Drop target file if already existing
             */
            unlink($targetConfig);
        }

        $source = new $sourceInstance($sourceConfig);
        self::assertInstanceOf($sourceInstance, $source);

        $target = new $targetInstance($targetConfig);
        self::assertInstanceOf($targetInstance, $target);

        $converted = FileConverter::convert($source, $target);
        self::assertInstanceOf($targetInstance, $converted);

        $converted = FileConverter::convertAndSave($source, $target);
        self::assertInstanceOf($targetInstance, $converted);

        self::assertFileExists($targetConfig);
    }

    /**
     * @test
     */
    public function canSuccessConversionOnInvalidSource()
    {

        $source = new ArrayConfigManager();
        $target = new YamlConfigManager(__DIR__ . '/../testsdata/sample_config_data.empty.converted.yml');

        $converted = FileConverter::convert($source, $target);
        self::assertInstanceOf('\clagiordano\weblibs\configmanager\YamlConfigManager', $converted);

        self::assertSame($target, $converted);
    }

    /**
     * @test
     */
    public function canSuccessConversionAndSaveOnInvalidSource()
    {

        $source = new ArrayConfigManager();
        $target = new YamlConfigManager(__DIR__ . '/../testsdata/sample_config_data.empty.converted.yml');

        $converted = FileConverter::convertAndSave($source, $target);
        self::assertInstanceOf('\clagiordano\weblibs\configmanager\YamlConfigManager', $converted);

        self::assertSame($target, $converted);
    }

    /**
     * @test
     */
    public function cannotFailConversionOnInvalidTarget()
    {
        $source = new ArrayConfigManager(__DIR__ . '/../testsdata/sample_config_data.php');
        $target = new YamlConfigManager();

        $converted = FileConverter::convert($source, $target);
        self::assertInstanceOf('\clagiordano\weblibs\configmanager\YamlConfigManager', $converted);
    }

    /**
     * @test
     */
    public function canFailConversionAndSaveOnInvalidTarget()
    {
        self::setExpectedException('\RuntimeException');

        $source = new ArrayConfigManager(__DIR__ . '/../testsdata/sample_config_data.php');
        $target = new YamlConfigManager();

        $converted = FileConverter::convertAndSave($source, $target);
        self::assertInstanceOf('\clagiordano\weblibs\configmanager\YamlConfigManager', $converted);
    }
}