"""
Utility for conversion between different formats for representing alignments.

classes:
FormatConverter
"""

# biopython
from Bio.Fasta.FastaAlign import FastaAlignment
from Bio.Clustalw import ClustalAlignment


class FormatConverter:
    """Convert between different alignment representation formats.

    The basic idea behind the converter is that it takes a given format,
    converts it into the base Alignment class, and then can return an object
    in any other supported format with the info from the basal alignment.

    Supported formats are:
    o Clustal format (*.aln)
    o Fasta format (*.fasta)
    """
    def __init__(self, to_convert):
        """Initialize a converter with a given object.

        Arguments:
        o to_convert - The class which we are going to be converting.
        """
        self.orig_format = to_convert

        self._base_alphabet, self._base_records = self._get_base_info()

    def _get_base_info(self):
        """Retrieve all of the basal (ie Generic.Alignment) info.

        The idea is that this info is present in all of the classes and
        this is the information that will be retained in a conversion.
        Format specific information will be lost.
        """
        return self.orig_format._alphabet, self.orig_format._records

    def to_fasta(self):
        """Convert the current info into a FastaAlignment object.
        """
        return_format = FastaAlignment(self._base_alphabet)
        return_format._records = self._base_records

        return return_format

    def to_clustal(self):
        """Convert the current info into a ClustalAlignment object.
        """
        return_format = ClustalAlignment(self._base_alphabet)
        return_format._records = self._base_records

        return return_format
