<?php

namespace App\Tools\DBAL;

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

class EnumFrequencyType extends Type
{
    const ENUM_FREQUENCY = 'EnumFrequencyType';
    const STATUS_DAILY = 'DAILY';
    const STATUS_EVERY3DAYS = 'EVERY 3 DAYS';
    const STATUS_WEEKLY = 'WEEKLY';
    const STATUS_EVERY10DAYS = 'EVERY 10 DAYS';
    const STATUS_FORTNIGHTLY = 'FORTNIGHTLY';
    const STATUS_MONTHLY = 'MONTHLY';
    const STATUS_BIMONTHLY = 'EVERY 2 MONTHS';
    const STATUS_QUARTERLY = 'EVERY 3 MONTHS';
    const STATUS_EVERY6MONTHS = 'EVERY 6 MONTHS';
    const STATUS_YEARLY = 'YEARLY';

    protected static $values = [
        'STATUS_DAILY' => 'DAILY',
        'STATUS_EVERY3DAYS' => 'EVERY 3 DAYS',
        'STATUS_WEEKLY' => 'WEEKLY',
        'STATUS_EVERY10DAYS' => 'EVERY 10 DAYS',
        'STATUS_FORTNIGHTLY' => 'FORTNIGHTLY',
        'STATUS_MONTHLY' => 'MONTHLY',
        'STATUS_BIMONTHLY' => 'EVERY 2 MONTHS',
        'STATUS_QUARTERLY' => 'EVERY 3 MONTHS',
        'STATUS_EVERY6MONTHS' => 'EVERY 6 MONTHS',
        'STATUS_YEARLY' => 'YEARLY',
    ];

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return "ENUM('DAILY', 'EVERY 3 DAYS', 'WEEKLY', 'EVERY 10 DAYS', 'FORTNIGHTLY', 'MONTHLY', 'EVERY 2 MONTHS', 'EVERY 3 MONTHS', 'EVERY 6 MONTHS', 'YEARLY')";
    }

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

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if (!in_array($value, [
                self::STATUS_DAILY,
                self::STATUS_EVERY3DAYS,
                self::STATUS_WEEKLY,
                self::STATUS_EVERY10DAYS,
                self::STATUS_FORTNIGHTLY,
                self::STATUS_MONTHLY,
                self::STATUS_BIMONTHLY,
                self::STATUS_QUARTERLY,
                self::STATUS_EVERY6MONTHS,
                self::STATUS_YEARLY, ]
        )) {
            throw new \InvalidArgumentException('Invalid status');
        }

        return $value;
    }

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

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

    /**
     * @return array<string>
     */
    public static function getAvailableTypes()
    {
        return [
            'Daily' => 'DAILY',
            'Every 3 days' => 'EVERY 3 DAYS',
            'Every week' => 'WEEKLY',
            'Every 10 days' => 'EVERY 10 DAYS',
            'Fortnightly' => 'FORTNIGHTLY',
            'Monthly' => 'MONTHLY',
            'Every 2 months' => 'EVERY 2 MONTHS',
            'Every 3 months' => 'EVERY 3 MONTHS',
            'Every 6 months' => 'EVERY 6 MONTHS',
            'Yearly' => 'YEARLY',
        ];
    }
}
