#! /usr/bin/env python
#  -*- coding: utf-8 -*-
#
# Support module generated by PAGE version 4.20
#  in conjunction with Tcl version 8.6
#    Jan 27, 2019 11:15:34 PM CET  platform: Linux

import sys
import mt940
import os.path as PT
import lxml.etree as ET
from datetime import date, time, datetime

#try:
#    import Tkinter as tk
#except ImportError:
import tkinter as tk

try:
    import ttk
    py3 = False
except ImportError:
    import tkinter.ttk as ttk
    py3 = True

from tkinter import messagebox
from tkinter.filedialog import askopenfilename

def set_Tk_var():
    global msg
    msg = tk.StringVar()
    msg.set('Otwórz plik z wyciągiem bankowym w formacie MT-940')

def config():
    #print('jpk_wb_support.config')
    msg.set('Ustawienia')
    sys.stdout.flush()

def generuj():
    # print('jpk_wb_support.generuj')
    # path to the mt940 file
    try: 
        sys.argv[1] 
    except IndexError: 
        infile = ''
    else:
        infile = sys.argv[1]
        
    mtf = mtfile(infile)
    if PT.isfile(mtf):
        alltran, xmlf = mt940.parse(mtf), xmlfile()
        msg.set('NumerRachunku:'+repr(alltran.data['account_identification']))
        opBal = alltran.data['final_opening_balance']
        clBal = alltran.data['final_closing_balance']
        Ok = True
        while Ok:
            dataOd = opBal.date #UserData('Od')
            dataDo = clBal.date #UserData('Do')
            if dataOd<=dataDo:
              Ok = False
            else:
              msg.set('Błędne daty')
        s_pocz = opBal.amount.amount
        s_kon = clBal.amount.amount
#   start write to xml file        
        root = root_jpk()
        Naglowek(root[0],dataOd,dataDo)
        Podmiot1(root[0])
        NumerRachunku(root[0],alltran)
        Salda(root[0],alltran)
        nrwiersza = 0
        debet, credit = 0, 0
        for tr in alltran:
            nrwiersza += 1
            dwiersz = WyciagWiersz(root[0],tr,nrwiersza,s_pocz)
            s_pocz = dwiersz['saldo']
            if dwiersz['status'] == 'D':
                debet += dwiersz['kw']
            else:
                credit += dwiersz['kw']
        WyciagCtrl(root[0],nrwiersza,debet,credit)
        msg.set('Ilość wierszy: '+str(nrwiersza)+'\n'+'Plik xml: '+xmlf)
        root[1].write(xmlf,pretty_print=True,doctype='<?xml version="1.0" encoding="UTF-8"?>')
        
    else:
        msg.set('Nie ma pliku o nazwie: '+mtf)
    sys.stdout.flush()

def open_mt940():
    # print('jpk_wb_support.open_mt940')
    name = askopenfilename(filetypes=(('MT940','*.STA'),('Wszystkie pliki','*.*')))
    k = len(w.mt_file.get())
    if k>0 :
       w.mt_file.delete(0,k)
    w.mt_file.insert(1,name)
    msg.set('otwieranie pliku...'+w.mt_file.get())
    w.b_Gen.configure(state='normal')
    w.sub_menu1.entryconfig(1,state='normal')
    sys.stdout.flush()

def quit():
    # print('jpk_wb_support.quit')
    yn = messagebox.askyesno('Zakończ','Czy na pewno chesz wyjść z programu?')
    if yn :
        destroy_window()
    sys.stdout.flush()

def init(top, gui, *args, **kwargs):
    global w, top_level, root
    w = gui
    top_level = top
    root = top

def destroy_window():
    # Function which closes the window.
    global top_level
    top_level.destroy()
    top_level = None

# generowanie pliku
def xmlfile():
    x = 'jpk_wb'
    d = str(date.today().year)+str(date.today().month)+str(date.today().day)
    x += d
    nr = 1
    while PT.isfile('./'+x+str(nr)+'.xml'):
         nr +=1
    return x+str(nr)+'.xml' 
       
def mtfile(x):
    if x != '':
       return x
    else:
       x = w.mt_file.get()
    if x == '': 
       x = 'Statement_12_2018.STA'
       print('Wybrano domyślną nazwa pliku MT-940: '+x)
    return x

def root_jpk():
    XML_NS = 'http://jpk.mf.gov.pl/wzor/2016/03/09/03092/'
    ETD_NS = 'http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/'
    NS_MAP = {None: XML_NS, "etd": ETD_NS}
    rootname = ET.QName(XML_NS,'JPK')
    x = list()
    x.append(ET.Element(rootname,nsmap=NS_MAP))
    x.append(ET.ElementTree(x[0]))
    return x
    
def Naglowek(x,od,do):
    y = ET.SubElement(x, 'Naglowek')
    ET.SubElement(y, 'KodFormularza',attrib={'kodSystemowy':'JPK_WB(1)','wersjaSchemy':'1-0'}).text ='JPK_WB'
    ET.SubElement(y, 'WariantFormularza').text = '1'
    ET.SubElement(y, 'CelZlozenia').text = '1'
    ET.SubElement(y, 'DataWytworzeniaJPK').text = datetime.now().isoformat('T','seconds')
    ET.SubElement(y, 'DataOd').text = od.isoformat()
    ET.SubElement(y, 'DataOd').text = do.isoformat()
    ET.SubElement(y, 'DomyslnyKodWaluty').text = 'PLN'
    ET.SubElement(y, 'KodUrzedu').text = '1209' #kod urzędu dla Krakowa Nowej Huty

def Podmiot1(x):
# Dodać wprowadzanie z pliku json
# -------------------------------
    podmiot = ET.SubElement(x, 'Podmiot1')
    ident = ET.SubElement(podmiot,'IdentyfikatorPodmiotu')
    ET.SubElement(ident,'NIP').text = '6760013533'
    ET.SubElement(ident,'PelnaNazwa').text = 'Małopolska Spółka Handlowa A.Chwedczuk Spółka Jawna'
    ET.SubElement(ident,'REGON').text = '12344324'
    adres = ET.SubElement(podmiot, 'AdresPodmiotu')
    ET.SubElement(adres, 'KodKraju').text = 'PL'
    ET.SubElement(adres,'Wojewodztwo').text = 'małopolskie'
    ET.SubElement(adres,'Powiat').text = 'Kraków'
    ET.SubElement(adres,'Gmina').text = 'Kraków'
    ET.SubElement(adres,'Ulica').text = 'Nowolipki'
    ET.SubElement(adres,'NrDomu').text = '3'
    ET.SubElement(adres,'NrLokalu')
    ET.SubElement(adres,'Miejscowosc').text = 'Kraków'
    ET.SubElement(adres,'KodPocztowy').text = '31-532'
    ET.SubElement(adres,'Poczta').text = 'Kraków'
    
def NumerRachunku(x,trans):
    nrrach = ET.SubElement(x, 'NumerRachunku')
    nrrach.text = trans.data['account_identification']
    
def Salda(x,trans):
    bal = ET.SubElement(x,'Salda')
    pocz = ET.SubElement(bal,'SaldoPoczatkowe')
    pocz.text = str(trans.data['final_opening_balance'].amount.amount)
    kon = ET.SubElement(bal,'SaldoKoncowe')
    kon.text = str(trans.data['final_closing_balance'].amount.amount)

def WyciagWiersz(x,tr,nrwiersza,saldo):
    wiersz = ET.SubElement(x,'WyciagWiersz',attrib={'typ':'G'})
    ET.SubElement(wiersz,'NumerWiersza').text = str(nrwiersza)
    ET.SubElement(wiersz,'DataOperacji').text = tr.data['date'].isoformat()
  
    detail = tr.data['transaction_details'].splitlines()
    pod,opis = '',''
    for naz in detail:
        if naz[:3] in '<27,<28':
            pod += naz[3:]+' '
        elif naz[:3] == '<20,<21':
            opis += naz[3:]+' '
    
    
    ET.SubElement(wiersz,'NazwaPodmiotu').text = pod.lstrip()
    ET.SubElement(wiersz,'OpisOperacji').text = opis.lstrip()
    
    kw = tr.data['amount'].amount
    status = tr.data['status']
    
    ET.SubElement(wiersz,'KwotaOperacji').text = str(kw)
    saldo += kw 
    ET.SubElement(wiersz,'SaldoOperacji').text = str(saldo)
    return {'saldo':saldo,'status':status,'kw':kw}
    
def WyciagCtrl(x,wiersze,debet,credit):
    ctrl = ET.SubElement(x,'WyciagCtrl')
    ET.SubElement(ctrl,'LiczbaWierszy').text = str(wiersze)
    ET.SubElement(ctrl,'SumaObciazen').text = str(debet.copy_abs())
    ET.SubElement(ctrl,'SumaUznan').text = str(credit)

def UserData(t):
    isValid = False
    while not isValid:
        pod = input('Podaj datę '+t+' [rrrr-mm-dd]: ')
        try:
             d = datetime.strptime(pod,'%Y-%m-%d')
             isValid = True
        except ValueError:
             print('Błędna data, spróbuj ponownie')
    return d

if __name__ == '__main__':
    import jpk_wb
    jpk_wb.vp_start_gui()




