import time

from netforce.model import Model, fields, get_model
from netforce.utils import get_file_path

class MatchingHDCase(Model):
    _name="clinic.matching.hdcase"
    _transient=True

    _fields={
        "date_from": fields.Date("From", required=True),
        "date_to": fields.Date("To", required=True),
        'file': fields.File("File"),
        'state': fields.Selection([["match","Math"],["not_match","Not Match"]],"State"),
    }
    
    def default_get(self,field_names=None,context={},**kw):
        defaults=context.get("defaults",{})
        datenow=time.strftime("%Y-%m-%d")
        date_from=defaults.get('date_from',datenow)
        date_to=defaults.get('date_to',datenow)
        res={
            'date_from': date_from,
            'date_to': date_to,
        }
        return res
    
    def get_rows(self,fpath=None):
        if not fpath:
            raise Exception("File not found")
        try:
            # or codecs.open on Python 2
            filedata = open(fpath, encoding='UTF-8').read() 
        except:
            filedata = open(fpath, encoding='TIS-620').read() 
        lines=filedata.split("\n")
        count=0
        rows=[]
        for line in lines:
            #open
            if '***' in line and count==0:
                count+=1
            #end    
            elif '***' in line and count==1:
                count=0

            #table content
            if count==1:
                line=line.replace("*","")
                line=line.replace("|","")
                i=0
                vals={}
                for l in line.split(","):
                    if l:
                        vals[i]=l  
                        i+=1
                # only right data
                if vals:
                    if len(vals)>1:
                        rows.append(vals)
        return rows

    def get_report_data(self,ids,context={}):
        hdcases={}
        defaults=self.default_get(context=context)
        date_from=defaults.get("date_from")
        date_to=defaults.get("date_to")
        lines=[]
        state="all"
        if ids:
            obj=self.browse(ids)[0]
            state=obj.state
            date_from=obj.date_from
            date_to=obj.date_to
            if obj.file:
                fpath=get_file_path(obj.file)
                rows=self.get_rows(fpath)
                if not rows:
                    raise Exception("No Data")
                #{0: ' A 01',
                 #1: ' 6',
                 #2: ' 11686',
                 #3: ' 91312851',
                 #4: ' 450124497',
                 #5: ' 27/01/2558 06:05:00',
                 #6: ' C',
                 #7: ' O',
                 #8: ' U ',
                 #9: ' N',
                 #10: ' Espogen',
                 #11: '       4000',
                 #12: '         30',
                 #13: '          1',
                 #14: '          0',
                 #15: '       1500',
                 #16: '       1500',
                 #17: ' 0',
                 #18: '       1500',
                 #19: ' S',
                 #20: ' U '}

                patients={}
                for pt in get_model("clinic.patient").search_read([],['name','hn_no','type_id']):
                    hn=pt['hn_no']
                    patients[hn]={
                        'id': pt['id'],
                        'name': pt['name'] or '',
                        'type': pt['type_id'][1],
                    }
                products={}
                for prod in get_model("product").search_read([],['name']):
                    name=(prod['name'] or "").replace(" ", "")
                    name=name.upper()
                    products[name]=prod['id']
                dom=[]
                dom.append(['date',">=",date_from])
                dom.append(['date',"<=",date_to])
                dom.append(['state','!=','cancelled'])
                hdcases={}
                hdcases2={}
                for hdcase in get_model("clinic.hd.case").search_browse(dom):
                    date=hdcase.date
                    hn=hdcase.patient_id.hn_no or 0
                    fee_amt=0
                    hct=hdcase.hct or "0"
                    hct=round(float(hct),2)
                    prod_line=[]
                    for line in hdcase.lines:
                        prod=line.product_id 
                        categ=prod.categ_id
                        if categ and line.reimbursable=='yes':
                            if categ.code=='EPO':
                                prod_name=(prod.name or "").split("-")
                                if len(prod_name) >= 1:
                                    prod_name=prod_name[0]
                                prod_line.append(prod_name)
                            elif categ.code=='FEE':
                                fee_amt=line.amount or 0
                    prod_name=''
                    if prod_line:
                        prod_name='-'.join(prod_line)
                    key1='%s-%s-%s-%s'%(date,hn,prod_name,fee_amt)
                    hdcases[key1]={
                        'id': hdcase.id,
                        'number': hdcase.number or '',
                        'note': '',
                    }
                    key2='%s-%s'%(date,hn)
                    hdcases2[key2]={
                        'id': hdcase.id,
                        'number': hdcase.number or '',
                        'note': '%s, %s, %s, %s, %s'%(date,hn,hct,prod_name,fee_amt),
                    }

                for row in rows:
                    vals=list(row.values())
                    date,_time=(vals[5] or "").split()
                    if len(date)<3:
                        raise Exception("Wrong format date")
                    d,m,y=date.split("/")
                    y=int(y)-543
                    date='%s-%s-%s'%(y,m,d)
                    hn=vals[3]
                    hn=''.join(x for x in (hn or "") if x.isdigit())
                    pt=patients.get(hn)
                    pt_type=''
                    pt_name=''
                    pt_id=None
                    if pt:
                        pt_name=pt['name']
                        pt_id=pt['id']
                        pt_type=pt['type']
                    hct=float(vals[12] or "0")
                    hct=round(hct,2)
                    fee_amt=float(vals[15] or "0")
                    fee_amt=round(fee_amt,2)
                    prod_name=vals[10] or ''
                    prod_name=prod_name.replace(" ", "")
                    prod_id=products.get(prod_name.upper(),None)
                    key1='%s-%s-%s-%s'%(date,hn,prod_name.upper(),fee_amt)
                    hdcase=hdcases.get(key1)
                    unit_amt=float(vals[11])
                    line_vals={
                        'hn': hn,
                        'date': date,
                        'patient_name': pt_name,
                        'patient_id': pt_id,
                        'patient_type': pt_type,
                        'hct': hct,
                        'prod_name': (prod_name or "").title(), 
                        'prod_id': prod_id,
                        'fee_amt': fee_amt,
                        'note': '',
                        'nf_date': '',
                        'nf_hn': '',
                        'nf_hct': '',
                        'nf_epo': '',
                        'nf_fee': '',
                        'unit_amt': unit_amt,
                    }
                    if hdcase:
                        line_vals['is_match']=True
                        line_vals['hd_case_id']=hdcase['id']
                        line_vals['hd_case_number']=hdcase['number']
                    else:
                        line_vals['is_match']=False
                        
                    key2='%s-%s'%(date,hn)
                    hdcase2=hdcases2.get(key2)
                    #print("hdcase2 ", hdcase2)
                    if hdcase2:
                        #line_vals['is_match']=False
                        line_vals['hd_case_id']=hdcase2['id']
                        line_vals['hd_case_number']=hdcase2['number']
                        line_vals['note']=''
                        nf_date,nf_hn,nf_hct,nf_epo,nf_fee=hdcase2['note'].split(",")
                        line_vals['nf_date']=nf_date
                        line_vals['nf_hn']=nf_hn
                        line_vals['nf_hct']=nf_hct
                        nf_epo=(nf_epo or "").replace("-",",")
                        line_vals['nf_epo']=nf_epo.title()
                        line_vals['nf_fee']=round(float((nf_fee or "0")),2)
                    lines.append(line_vals)
        no=1
        lines2=[]
        total=0
        total_match=0
        total_unmatch=0
        for line in sorted(lines,key=lambda x: x['hn']):
            is_match=line.get('is_match',False)
            if is_match:
                total_match+=1
            else:
                total_unmatch+=1
            total+=1
            if state=='not_match' and is_match:
                continue
            elif state=='match' and not is_match:
                continue
            else:
                pass
            line['no']=no
            lines2.append(line)
            no+=1
        lines=lines2
        date=''
        if date_from==date_to:
            date=date_from
        data={
            'lines': lines,
            'date_from': date_from,
            'date_to': date_to,
            'date': date,
            'total': total,
            'total_match': total_match,
            'total_unmatch': total_unmatch,
        }
        return data

    def onchange_date(self,context={}):
        data=context['data']
        data['date_to']=data['date_from']
        return data

MatchingHDCase.register()