<?php

namespace App\Tools\DBAL;

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

class EnumNoticePriorityType extends Type
{
    const ENUM_NOTICE_PRIORITY_TYPE = 'EnumNoticePriorityType';
    const TYPE_NOTE = 'NOTE';
    const TYPE_LOW_PRIORITY = 'LOW PRIORITY';
    const TYPE_MEDIUM_PRIORITY = 'MEDIUM PRIORITY';
    const TYPE_HIGH_PRIORITY = 'HIGH PRIORITY';

    protected static $values = [
        'TYPE_NOTE' => 1,
        'TYPE_LOW_PRIORITY' => 2,
        'TYPE_MEDIUM_PRIORITY' => 3,
        'TYPE_HIGH_PRIORITY' => 4,
    ];

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return "ENUM('1', '2', '3', '4')";
    }

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

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

        return $value;
    }

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

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

    /**
     * @return array <string>
     */
    public static function getAvailableTypes()
    {
        return [
            static::TYPE_NOTE => 1,
            static::TYPE_LOW_PRIORITY => 2,
            static::TYPE_MEDIUM_PRIORITY => 3,
            static::TYPE_HIGH_PRIORITY => 4,
        ];
    }

    public static function getForGrid()
    {
        return [
            ['label' => static::TYPE_NOTE, 'value' => 1],
            ['label' => static::TYPE_LOW_PRIORITY, 'value' => 2],
            ['label' => static::TYPE_MEDIUM_PRIORITY, 'value' => 3],
            ['label' => static::TYPE_HIGH_PRIORITY, 'value' => 4],
        ];
    }
}
