# Copyright 2013 by Zheng Ruan (zruan1991@gmail.com).
# All rights reserved.
# This code is part of the Biopython distribution and governed by its
# license.  Please see the LICENSE file that should have been included
# as part of this package.
"""Code for Codon Alphabet.
 
CodonAlphabet class is interited from Alphabet class. It is an
alphabet for CodonSeq class.
 
"""
__docformat__ = "epytext en"  # Don't just use plain text in epydoc API pages!
 
 
import copy
try:
    from itertools import izip
except ImportError:
    izip = zip
 
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import IUPAC, Gapped, HasStopCodon, Alphabet, generic_dna
from Bio.Data.CodonTable import generic_by_id
 
 
default_codon_table = copy.deepcopy(generic_by_id[1])
 
def get_codon_alphabet(alphabet, gap="-", stop="*"):
    """function to get alignment alphabet for codon alignment. Only
    nucleotide alphabet is accepted. Raise an error when the type of 
    alphabet is incompatible.
    """
    from Bio.Alphabet import NucleotideAlphabet
    if isinstance(alphabet, NucleotideAlphabet):
        alpha = alphabet
        if gap:
            alpha = Gapped(alpha, gap_char=gap)
        if stop:
            alpha = HasStopCodon(alpha, stop_symbol=stop)
    else:
        raise TypeError("Only Nuclteotide Alphabet is accepted!")
    return alpha
 
default_alphabet = get_codon_alphabet(IUPAC.unambiguous_dna)
 
class CodonAlphabet(Alphabet):
    """Generic Codon Alphabet with a size of three"""
    size = 3
    letters = None
    name = ''
    def __repr__(self):
        return "%s(%s)" % (self.__class__.__name__, self.names[0])
 
 
def get_codon_alphabet(codon_table, gap_char="-"):
    letters = list(codon_table.forward_table.keys())
    letters.extend(codon_table.stop_codons)
    letters.extend(codon_table.start_codons)
    if gap_char:
        letters.append(gap_char*3)
    generic_codon_alphabet = CodonAlphabet()
    generic_codon_alphabet.letters = letters
    generic_codon_alphabet.gap_char = '-'
    generic_codon_alphabet.names = codon_table.names
    return generic_codon_alphabet
 
default_codon_alphabet = get_codon_alphabet(default_codon_table)
 
 
if __name__ == "__main__":
    from Bio._utils import run_doctest
    run_doctest()