# -*- coding: UTF-8 -*-
import os
import os.path
import sys
import codecs
import shutil
import re
from util import *
lua_data_dir = "../lua/"
excel_dir = "../策划脚本/".decode('utf-8')

def table2lua(table,main_key, jsonfilename):
    con_array = []
    uncon_array = []
    nrows = table.nrows
    ncols = table.ncols
    if os.path.exists(jsonfilename):
        print 'error : ',jsonfilename,'already exist!'
        exception()
    f = codecs.open(jsonfilename,"w","utf-8")
    f.write(u"return {\n")
    if main_key != None and main_key != "":
        main_key = main_key.split("@")
    objNames = []
    objTypes = []
    for r in range(1,nrows):
        if r == 2:
            continue
        line = u"{"
        if r == 1:
            line = u"[\"_key_\"] = " + line
        main_key_list = []

        for c in range(ncols):
            strCellValue = u""
            if c>=len(objNames):
                objNames.append(str(table.cell_value(1,c)))
                objTypes.append(str(table.cell_value(2,c)))
            objName = objNames[c]
            objType = objTypes[c]
            objStr = table.cell_value(r,c) or ""
            if(objName.find("@") >= 0):
                continue
            if(len(objName) == 0):
                continue

            if len(con_array) > 0:
                check = False
                for it in con_array:
                    if it == objName:
                        check = True
                        break
                if not check:
                    continue       
            elif len(uncon_array) > 0:
                check = True
                for it in uncon_array:
                    if it == objName:
                        check = False
                        break
                if not check:
                    continue     
                     
            if r == 0 or r == 1:
                if type(objStr) == float:
                    firstCol = str(table.cell_value(r,0))
                    print 'Type Error: (row:%s,col:%s)' % (firstCol,objName)
                    exception()
                strCellValue = u"\""  + objStr + u"\""
            else:
                if cmp(objType, "NUMBER") == 0 or cmp(objType, "FLOAT") == 0:
                    strCellValue = FloatToString(objStr)
                    if strCellValue == False:
                        print u"fail to read \t"+str(r+1)+":"+str(table.cell_value(r,1))+"\t"+int2index(c)+":"+str(table.cell_value(0,c))
                        exception()
                else:
                    strvalue = StringToString(objStr).strip();
                    strvalue = "".join(strvalue.split("\n"))
                    strCellValue = u"\""  + strvalue + u"\""
            line = line + strCellValue
            if (main_key == None or main_key==""):
                main_key = [objName]
            if r > 1 and objName in main_key:
                if len(main_key_list) < len(main_key) :
                    if main_key.index(objName) == 0:
                        main_key_list = [strCellValue]+main_key_list
                    else:
                        main_key_list = main_key_list+[strCellValue]
                if len(main_key_list) == len(main_key) :
                    # if [x for x in main_key_list if x!= 0 and x!="" ] == 0:
                        # continue
                    if len(main_key_list) > 1:
                        line = u"[\"" + main_key_list[0]+"@"+main_key_list[1] + u"\"] = " + line
                    else:
                        line = u"[" + main_key_list[0]+ u"] = " + line

            line += u","
            # if c < ncols-1:
            #     isNext = haveNext(table, c+1, 1, ncols)
            #     if isNext != 0:                   
            #f.write(strCellValue)
        line = line + u"}"
        f.write(line)
        if r>1 and len(main_key_list)==0:
            print "指定 键值不存在".decode('utf-8'),main_key[0],":",table.name
            f.close()
            exception()
        # f.write(u" }")
        # if r < nrows-1:
        #     f.write(u",")
        # f.write(u"\n")
        f.write(u",\n")
    f.write(u"}")
    f.close()
    return


def excelTolua(filename,sheets):
    data = openxml(excel_dir+filename)
    for table in data:
        if table.name not in sheets:
            continue
        print 'trans excel:' ,filename,table.name
        v = sheets[table.name]
        sheets[table.name]=None
        destfilename = os.path.join(lua_data_dir+v[1], table.name + ".lua")
        table2lua(table,v[0],destfilename)
    for (k,v) in sheets.items():
        if v == None:
            continue
        print 'error : ',filename,k,'not exist!'
        exception()

def tag2luaTable(tagname,taglist):
    ret = u"{"
    for name in taglist:
        v = u"\"" + tagname + u"." + name + u"\","
        ret = ret + v
    ret = ret + u"}"
    return ret

if __name__ == '__main__':
    reload(sys)
    sys.setdefaultencoding( "utf-8" )
    if os.path.isdir(lua_data_dir):
        shutil.rmtree(lua_data_dir)
    os.mkdir(lua_data_dir)
    map_tag = dict()
    file = open("LuaConfig.txt") 
    r = re.compile('(\t|\n|\r)')
    sheetMap = dict()
    while True:
        lines = file.readlines(1000)
        if not lines:
            break
        for line in lines:
            if line.startswith('#'):
                continue
            line = r.sub('',line)
            if line == "":
                continue
            x = line.split(':')
            if len(x)<2:
                print 'error:',line
                file.close()
                exception()
            if x[0] not in sheetMap:
                sheetMap[x[0]]=dict()
            if len(x) <3:
                sheetMap[x[0]][x[1]]=(None,"")
            elif len(x)<4:
                sheetMap[x[0]][x[1]]=(x[2],"")
            else:
                sheetMap[x[0]][x[1]]=(x[2],x[3])

                tag_str = x[3]
                if tag_str != '':
                    dir_str = os.path.join(lua_data_dir, tag_str)
                    if not os.path.isdir(dir_str):
                        os.mkdir(dir_str)
                        map_tag[tag_str] = [] 
                    map_tag[tag_str].append(x[1])
    file.close()
    for (k,v) in sheetMap.items():
        excelTolua(k,v)


    if len(map_tag) > 0:
        mfilename = os.path.join(lua_data_dir, "_merge_.lua")
        f = codecs.open(mfilename,"w","utf-8")
        f.write(u"return {\n")
        for k,v in map_tag.items():
            line = k + u" = " + tag2luaTable(k,v) + u",\n"
            f.write(line)
        f.write(u"}")
        f.close()