<?php

namespace App\Tools\DBAL;

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

class EnumLinkStatusType extends Type
{
    const ENUM_NAME = 'EnumLinkStatusType';
    const TYPE_ACTIVE = 'ACTIVE';
    const TYPE_INACTIVE = 'INACTIVE';
    const TYPE_PROBLEM = 'PROBLEM';
    const TYPE_PENALTY = 'PENALTY';

    protected static $values = [
        self::TYPE_ACTIVE,
        self::TYPE_INACTIVE,
        self::TYPE_PROBLEM,
        self::TYPE_PENALTY,
    ];

    /**
     * @return array <string>
     */
    public static function getValues()
    {
        return [
            'Active' => static::TYPE_ACTIVE,
            'Inactive' => static::TYPE_INACTIVE,
            'Problem' => static::TYPE_PROBLEM,
            'Penalty' => static::TYPE_PENALTY,
        ];
    }

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return sprintf('ENUM('.str_repeat("'%s', ", count(self::$values) - 1)."'%s')", ...self::$values);
    }

    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 value for '.self::getName());
        }

        return $value;
    }

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

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