<?php

namespace Google\Protobuf\Internal;

use Google\Protobuf\EnumValueDescriptor;

class EnumDescriptor
{
    use HasPublicDescriptorTrait;

    private $klass;
    private $legacy_klass;
    private $full_name;
    private $value;
    private $name_to_value;
    private $value_descriptor = [];

    public function __construct()
    {
        $this->public_desc = new \Google\Protobuf\EnumDescriptor($this);
    }

    public function setFullName($full_name)
    {
        $this->full_name = $full_name;
    }

    public function getFullName()
    {
        return $this->full_name;
    }

    public function addValue($number, $value)
    {
        $this->value[$number] = $value;
        $this->name_to_value[$value->getName()] = $value;
        $this->value_descriptor[] = new EnumValueDescriptor($value->getName(), $number);
    }

    public function getValueByNumber($number)
    {
        if (isset($this->value[$number])) {
            return $this->value[$number];
        }
        return null;
    }

    public function getValueByName($name)
    {
        if (isset($this->name_to_value[$name])) {
            return $this->name_to_value[$name];
        }
        return null;
    }

    public function getValueDescriptorByIndex($index)
    {
        if (isset($this->value_descriptor[$index])) {
            return $this->value_descriptor[$index];
        }
        return null;
    }

    public function getValueCount()
    {
        return count($this->value);
    }

    public function setClass($klass)
    {
        $this->klass = $klass;
    }

    public function getClass()
    {
        return $this->klass;
    }

    public function setLegacyClass($klass)
    {
        $this->legacy_klass = $klass;
    }

    public function getLegacyClass()
    {
        return $this->legacy_klass;
    }

    public static function buildFromProto($proto, $file_proto, $containing)
    {
        $desc = new EnumDescriptor();

        $enum_name_without_package  = "";
        $classname = "";
        $legacy_classname = "";
        $fullname = "";
        GPBUtil::getFullClassName(
            $proto,
            $containing,
            $file_proto,
            $enum_name_without_package,
            $classname,
            $legacy_classname,
            $fullname);
        $desc->setFullName($fullname);
        $desc->setClass($classname);
        $desc->setLegacyClass($legacy_classname);
        $values = $proto->getValue();
        foreach ($values as $value) {
            $desc->addValue($value->getNumber(), $value);
        }

        return $desc;
    }
}
