#!/usr/bin/env python3
#
#  Copyright (C) 2017 Codethink Limited
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2 of the License, or (at your option) any later version.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
#  Authors:
#        Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>

from .. import _yaml
from .._exceptions import LoadError, LoadErrorReason
from .option import Option, OPTION_SYMBOLS


# OptionEnum
#
# An enumeration project option
#
class OptionEnum(Option):

    OPTION_TYPE = 'enum'

    def load(self, node, allow_default_definition=True):
        super(OptionEnum, self).load(node)

        valid_symbols = OPTION_SYMBOLS + ['values']
        if allow_default_definition:
            valid_symbols += ['default']

        _yaml.node_validate(node, valid_symbols)

        self.values = _yaml.node_get(node, list, 'values', default_value=[])
        if not self.values:
            raise LoadError(LoadErrorReason.INVALID_DATA,
                            "{}: No values specified for {} option '{}'"
                            .format(_yaml.node_get_provenance(node), self.OPTION_TYPE, self.name))

        # Allow subclass to define the default value
        self.value = self.load_default_value(node)

    def load_value(self, node):
        self.value = _yaml.node_get(node, str, self.name)
        self.validate(self.value, _yaml.node_get_provenance(node, self.name))

    def set_value(self, value):
        self.validate(value)
        self.value = value

    def get_value(self):
        return self.value

    def validate(self, value, provenance=None):
        if value not in self.values:
            prefix = ""
            if provenance:
                prefix = "{}: ".format(provenance)
            raise LoadError(LoadErrorReason.INVALID_DATA,
                            "{}Invalid value for {} option '{}': {}\n"
                            .format(prefix, self.OPTION_TYPE, self.name, value) +
                            "Valid values: {}".format(", ".join(self.values)))

    def load_default_value(self, node):
        value = _yaml.node_get(node, str, 'default')
        self.validate(value, _yaml.node_get_provenance(node, 'default'))
        return value
