import csv
import enum


class Usability(enum.Enum):
    UNKNOWN = 0
    USER = 1
    BOT = 2
    BOTH = 4


class MethodInfo:
    def __init__(self, name, usability, errors):
        self.name = name
        self.errors = errors
        try:
            self.usability = {
                'unknown': Usability.UNKNOWN,
                'user': Usability.USER,
                'bot': Usability.BOT,
                'both': Usability.BOTH,
            }[usability.lower()]
        except KeyError:
            raise ValueError('Usability must be either user, bot, both or '
                             'unknown, not {}'.format(usability)) from None


def parse_methods(csv_file, errors_dict):
    """
    Parses the input CSV file with columns (method, usability, errors)
    and yields `MethodInfo` instances as a result.
    """
    with csv_file.open(newline='') as f:
        f = csv.reader(f)
        next(f, None)  # header
        for line, (method, usability, errors) in enumerate(f, start=2):
            try:
                errors = [errors_dict[x] for x in errors.split()]
            except KeyError:
                raise ValueError('Method {} references unknown errors {}'
                                 .format(method, errors)) from None

            yield MethodInfo(method, usability, errors)
