<?PHP
/**
 * Represents a type of damage an object may be subject to.
 *
 * @author Joshua Ramon Enslin <joshua@museum-digital.de>
 */
declare(strict_types = 1);

/**
 * Represents a type of damage an object may be subject to.
 */
enum MDObjectDamageType implements MDValueEnumInterface, JsonSerializable {

    case water_damage;
    case breakage;

    /**
     * Returns a value of this type based on a string.
     *
     * @param string $input Input to get a value from.
     *
     * @return MDObjectDamageType
     */
    public static function fromString(string $input):MDObjectDamageType {

        return match($input) {
            'water_damage' => self::water_damage,
            'breakage' => self::breakage,
            default => throw new MDpageParameterNotFromListException("Unknown damage type"),
        };

    }

    /**
     * Lists all available names.
     *
     * @return array<string>
     */
    public static function caseNames():array {

        $output = [];

        $cases = self::cases();
        foreach ($cases as $case) {
            $output[] = $case->name;
        }

        return $output;

    }

    /**
     * Gets an unsorted list of the entries in a translated version.
     *
     * @param MDTlLoader $tlLoader Translation loader.
     *
     * @return array<string, string>
     */
    public static function getUnsortedList(MDTlLoader $tlLoader):array {
        return MDValueSet::getTlUnsortedList($tlLoader, self::caseNames(), "object_damage_types_set", "object_damage_types_set");

    }

    /**
     * Gets a sorted list of the entries in a translated version.
     *
     * @param MDTlLoader $tlLoader Translation loader.
     *
     * @return array<string, string>
     */
    public static function getSortedList(MDTlLoader $tlLoader):array {
        return MDValueSet::getTlSortedList($tlLoader, self::caseNames(), "object_damage_types_set", "object_damage_types_set");

    }

    /**
     * Returns the name of the current value in translation.
     *
     * @param MDTlLoader $tlLoader Translation loader.
     *
     * @return string
     */
    public function getTledName(MDTlLoader $tlLoader):string {

        return $tlLoader->tl("object_damage_types_set", "object_damage_types_set", $this->name);

    }

    /**
     * Provides the option to serialize as a string during json_encode().
     *
     * @return string
     */
    public function jsonSerialize():string {

        return $this->name;

    }
}