from _asap import fitentry
from asap.parameters import rcParams

class asapfit(fitentry):

    def __init__(self, other=None):
        if isinstance(other, fitentry):
            fitentry.__init__(self,other)
        else:
            fitentry.__init__(self)

    def __str__(self):
        out = ""
        out += "Fit:"
        pars = self.getparameters()
        mask = self.getfixedparameters()
        funcs = self.getfunctions()
        comps = self.getcomponents()
        finfo = self.getframeinfo()
        pos=0
        k = 0
        for f in funcs:
            out += "\n Type:         "
            out += f
            s = pos
            pos += comps[k]
            ps = pars[s:pos]
            out += "\n  Parameters:  "
            out += self._format_pars(pars[s:pos],f, finfo[0])
            out += "\n  Fixed Parms: "
            out += str(mask[s:pos])
            out += "\n  Frame:       "
            out += str(finfo)
            out += "\n"
        out += "\n"
        return out

    def as_dict(self):
        out = []
        pars = self.getparameters()
        mask = self.getfixedparameters()
        funcs = self.getfunctions()
        comps = self.getcomponents()
        pos=0
        k=0
        comp = []
        for f in funcs:
            s = pos
            pos += comps[k]
            ps = pars[s:pos]
            d = {'function' : f,
                  'parameters' : pars[s:pos],
                  'fixed' : mask[s:pos],
                  'frame' : self.getframeinfo()
                  }
            comp.append(d)
            k+=1
        out.append(comp)
        return out

    def save(self, filename):
        f = file(filename, 'w')
        parstr = ""
        for i in xrange(self.getcomponents()[0]):
            pname = "P%d"% (i)
            parstr += "%-12s " % (pname)
        header = "#%-12s %s\n" % ("Function", parstr)
        f.write(header)
        i = 0
        funcs=self.getfunctions()
        pars=self.getparameters()
        for c in self.getcomponents():
            line = " %-12s " % (funcs[i])
            for j in xrange(c):
                line += "%3.8f " % (pars[i*c+j])
            i+=1
            f.write(line+"\n")
        f.close()

    def _format_pars(self, pars, ftype, unit):
        out = ''
        if ftype == 'poly':
            i = 0
            for p in pars:
                out += ' p%d = %3.6f %s,' % (i,p,unit)
                i+=1
            out = out[1:-1]
        elif ftype == 'gauss':
            out += 'peak = %3.6f , centre = %3.6f %s, FWHM = %3.6f %s' % (pars[0],pars[1],unit,pars[2],unit)
        return out
