<?php

namespace App\Tools\DBAL;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class EnumConclusionType extends Type
{
    const ENUM_CONCLUSION_TYPE = 'EnumConclusionType';
    const TYPE_NEGATIVE = 'NEGATIVE';
    const TYPE_NEUTRAL = 'NEUTRAL';
    const TYPE_POSITIVE = 'POSITIVE';

    protected static $values = [
        'TYPE_NEGATIVE' => 'NEGATIVE',
        'TYPE_NEUTRAL' => 'NEUTRAL',
        'TYPE_POSITIVE' => 'POSITIVE',
    ];

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return "ENUM('NEGATIVE', 'NEUTRAL', 'POSITIVE')";
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value;
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if ($value && !in_array($value, self::$values)) {
            throw new \InvalidArgumentException('Invalid conclusion type');
        }

        return $value;
    }

    public function getName()
    {
        return self::ENUM_CONCLUSION_TYPE;
    }

    public function requiresSQLCommentHint(AbstractPlatform $platform)
    {
        return true;
    }

    /**
     * @return array <string>
     */
    public static function getAvailableTypes()
    {
        return [
            static::TYPE_NEGATIVE => 'NEGATIVE',
            static::TYPE_NEUTRAL => 'NEUTRAL',
            static::TYPE_POSITIVE => 'POSITIVE',
        ];
    }
}
