<?php

namespace App\Tools\DBAL;

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

class EnumApprovementType extends Type
{
    const ENUM_APPROVEMENT_TYPE = 'EnumApprovementType';
    const TYPE_MANUAL = 'MANUAL';
    const TYPE_AUTOMATIC = 'AUTOMATIC';
    const TYPE_AFTER2WEEKS = 'AFTER2WEEKS';

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return "ENUM('MANUAL', 'AUTOMATIC', 'AFTER2WEEKS')";
    }

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

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if ($value && !in_array($value, [
                self::TYPE_MANUAL,
                self::TYPE_AUTOMATIC,
                self::TYPE_AFTER2WEEKS,
            ]
        )) {
            throw new \InvalidArgumentException('Invalid approvement type');
        }

        return $value;
    }

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

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

    /**
     * @return array<string>
     */
    public static function getAvailableTypes()
    {
        return [
            'manual' => self::TYPE_MANUAL,
            'automatic' => self::TYPE_AUTOMATIC,
            'after 2 weeks' => self::TYPE_AFTER2WEEKS,
        ];
    }
}
