from bsPlugins import *
from bbcflib.track import convert, _track_map
from bbcflib import genrep
import os
format_list = ['bedgraph', 'wig', 'bed', 'sql', 'gff', 'sga', 'bigwig']
class FileConvertForm(BaseForm):
    hover_help = True
    show_errors = True
    infile = twb.BsFileField(label='File: ',
        help_text='Select file.',
        validator=twb.BsFileFieldValidator(required=True))
    child = twd.HidingTableLayout()
    to = twd.HidingSingleSelectField(label='Output format: ',
        options=format_list,
        prompt_text=None,
        mapping={'sql': ['dtype', 'assembly'],
                 'bigwig': ['assembly']},
        validator=twc.Validator(required=True),
        help_text='Select the format of your result')
    dtype = twf.SingleSelectField(label='Output datatype: ',
        prompt_text=None,
        options=['quantitative', 'qualitative'],
        help_text='Choose sql data type attribute')
    assembly = twf.SingleSelectField(label='Assembly: ',
        options=genrep.GenRep().assemblies_available(),
        help_text='Reference genome')
    submit = twf.SubmitButton(id="submit", value="Convert")
meta = {'version': "1.0.0",
        'author': "BBCF",
        'contact': "webmaster-bbcf@epfl.ch"}
in_parameters = [{'id': 'infile', 'type': 'track', 'required': True},
                 {'id': 'to', 'type': 'list'},
                 {'id': 'dtype', 'type': 'list'},
                 {'id': 'assembly', 'type': 'assembly'}]
out_parameters = [{'id': 'converted_file', 'type': 'track'}]
[docs]class FileConvertPlugin(BasePlugin):
    """Converts a file to another equivalent format (examples: wig to bedgraph, gff to bed). Recognised input formats are %s."""
    __doc__ %= ", ".join(sorted(_track_map.keys())[1:])
    info = {
        'title': 'File format conversion',
        'description': __doc__,
        'path': ['Files', 'Convert'],
        'output': FileConvertForm,
        'in': in_parameters,
        'out': out_parameters,
        'meta': meta,
        }
    def __call__(self, **kw):
        ext = kw.get('to','sql')
        info = {'datatype': kw.get('datatype') or 'qualitative'}
        infile = kw.get('infile')
        fname = os.path.splitext(os.path.split(infile)[-1])[0]
        outfile = self.temporary_path(fname=fname, ext=ext)
        convert(infile, outfile,
                chrmeta=kw.get('assembly') or None, info=info)
        self.new_file(outfile, 'converted_file')
        return self.display_time()