class Error (Exception): pass


flags_in_order = [
    'assembled',
    'assembled_into_one_contig',
    'region_assembled_twice',
    'complete_gene',
    'unique_contig',
    'scaffold_graph_bad',
    'assembly_fail',
    'variants_suggest_collapsed_repeat',
    'hit_both_strands',
    'has_variant',
    'ref_seq_choose_fail',
]


flag_bits = {flags_in_order[i]: pow(2, i) for i in range(len(flags_in_order))}


class Flag:
    def __init__(self, n=0):
        self.flags = {x: False for x in flags_in_order}
        self.set_flag(n)


    def set_flag(self, n):
        for f in self.flags:
            if flag_bits[f] & n != 0:
                self.flags[f] = True


    def add(self, f):
        self.flags[f] = True


    def to_number(self):
        n = 0
        for f in self.flags:
            if self.flags[f]:
                n += flag_bits[f]
        return n

    def __eq__(self, other):
       return type(other) is type(self) and self.__dict__ == other.__dict__


    def __str__(self):
        return str(self.to_number())


    def to_long_string(self):
        lines = []
        for f in flags_in_order:
            x_or_not = 'X' if self.flags[f] else ' '
            lines.append('[' + x_or_not + '] ' + f)
        return '\n'.join(lines)


    def has(self, s):
        return self.flags[s]


    def to_comma_separated_string(self):
        return ','.join([f for f in flags_in_order if self.flags[f]])
