#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Alere Pima
"""
from datetime import datetime
from bika.lims.utils import to_unicode
from bika.lims import bikaMessageFactory as _
from bika.lims.exportimport.instruments.resultsimport import \
    AnalysisResultsImporter, InstrumentCSVResultsFileParser

class AlerePimaSLKParser(InstrumentCSVResultsFileParser):
    #This class is made thinking in beads, but the other files
    # are quite similar.
    def __init__(self, slk):
        InstrumentCSVResultsFileParser.__init__(self, slk)
        self._columns = {} #The diferents data columns names
        self._linedata = {}#The line with the data
        self._rownum = None
        self._isFirst = True #Used to know if is the first linedata


    def parse(self):
        infile = self.getInputFile()
        self.log("Parsing file ${file_name}", mapping={"file_name":infile.filename})
        for line in infile.readlines():
            line = line.split(';')
            #The end of file
            if line[0] == 'E\n':
                self.log(
                "End of file reached successfully: ${total_objects} objects, "
                "${total_analyses} analyses, ${total_results} results",
                mapping={"total_objects": self.getObjectsTotalCount(),
                "total_analyses": self.getAnalysesTotalCount(),
                "total_results":self.getResultsTotalCount()}
                )
                self.builddict(self._isFirst)
                return True
            #The header
            elif line[0] != 'C' and line[0] != 'E':
                self._header[line[0]] = line[1]
            #Obtain the columns name
            elif line[0] == 'C' and line[2] == 'Y1':
                self._columns[line[1]] = line[3].split('"')[1]
                #self._columns.append(line[3].split('"')[1])
            #Is a data line
            else:
                if line[2] != self._rownum:
                    self.builddict(self._isFirst)
                    self._linedata = {}
                    self._rownum = line[2]
                data = line[3].split('"')
                if len(data) >1:
                    self._linedata[line[1]] = data[1]
                else:
                    self._linedata[line[1]] = data[0][1:-1]


    def builddict(self,isFirst):
        #Buid the dict parsing self._columns and self._linedata
        #This method should be modified to read other files
        rawdict = {}
        if self._isFirst:
            self._isFirst = False
        else:
            for i in self._columns.keys():
                if i in self._linedata:
                    rawdict[self._columns[i]] = self._linedata[i]
                else:
                    rawdict[self._columns[i]] = None

            rawdict['Remarks'] = rawdict['ErrorMessage']
            rawdict['DefaultResult'] = self._columns['X6']
            #I don't know which is the analysis service keyword...
            self._addRawResult(rawdict['Sample'],{rawdict['Assay ID']:rawdict})

    def getAttachmentFileType(self):
        #This method must be override for other file types.
        return "Alare Pima Beads"

class AlerePimaImporter(AnalysisResultsImporter):

    def __init__(self, parser, context, idsearchcriteria, override,
                 allowed_ar_states=None, allowed_analysis_states=None,
                 instrument_uid=None):
        AnalysisResultsImporter.__init__(self, parser, context,
                                         idsearchcriteria, override,
                                         allowed_ar_states,
                                         allowed_analysis_states,
                                         instrument_uid)
