<?php

namespace App\Tools\DBAL;

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

class EnumMessageDirectionType extends Type
{
    const ENUM_MESSAGE_DIRECTION_TYPE = 'EnumMessageDirectionType';
    const TYPE_INBOUND = 'INBOUND';
    const TYPE_OUTBOUND = 'OUTBOUND';

    protected static $values = [
        'TYPE_INBOUND' => self::TYPE_INBOUND,
        'TYPE_OUTBOUND' => self::TYPE_OUTBOUND,
    ];

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return "ENUM('INBOUND', 'OUTBOUND')";
    }

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

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if (!in_array($value, [
                self::TYPE_INBOUND,
                self::TYPE_OUTBOUND,
            ]
        )) {
            throw new \InvalidArgumentException('Invalid status');
        }

        return $value;
    }

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

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

    /**
     * @return array<string>
     */
    public static function getAvailableTypes()
    {
        return [
            'inbound' => self::TYPE_INBOUND,
            'outbound' => self::TYPE_OUTBOUND,
        ];
    }
}
