#!/usr/bin/env python
# coding: Shift_JIS

# ##############################

# ファイル名: trans2celladds.py
# 機能: 各イベント・処理・状態変数名・状態変数の取りうる値それぞれにセル番地を割り当てて，
#	状態遷移表のセル情報を作成する． 罫線の範囲と，着色の対象とするセル情報も作成する．
#	また，各関数におけるこれらのセル情報をすべて統合する．
# 関数: trans2celladds
# 著者名: 山本椋太，若林丈紘

# ##############################

import re
import os
import shutil
import sys

# ##############################

# 関数名: trans2celladds
# 機能: 状態遷移表の構成要素となる文字列に，セル番地や文字色，結合のセル情報を付加する．
# 引数
#   param: 状態変数
#   funcnames: makestmの処理までたどり着いた関数名のリスト
#   directory: 解析対象の関数に関する情報がまとめられたディレクトリ

# ##############################

def trans2celladds(param,funcnames,directory):

    print("\n===============")
    print("= trans2celladds =")
    print("param: ", param)
    print("funcnames: ", funcnames)
    print("directory: ",directory)
    print("===============\n")

    # ############################

    # 関数: trans2celladds
    # 機能：状態遷移表の構成要素となる文字列に，セル番地や文字色，結合のセル情報を付加する

    # INPUT ： stm_report_message.tsv, stm_eventlist.tsv, stm_tablecolumn.tsv
    # OUTPUT: color_jotaisenni.tsv, v_new_tableinfo.tsv, v_new_tableinfo_union.tsv, jotaisenni.tsv

    # INPUTの入力元 : temp/FUNCTION/ (FUNCTIONは任意の関数名),
    #                  TSV_info/ (stm_report_messsage.tsvのみ)
    # OUTPUTの出力先: TSV_info/

    # stm_report_message.tsv: 各関数における警告・エラー文の一覧
    # stm_eventlist.tsv     : 関数FUNCTIONにおけるイベントの一覧
    # stm_tablecolumn.tsv   : 関数FUNCTIONにおいて状態遷移表の各列に出力される文字列の一覧

    # color_jotaisenni.tsv     : 状態遷移表のうち状態変数を含む処理のあるセル番地の一覧
    # v_new_tableinfo.tsv      : 罫線を引く対象となるセル範囲の一覧
    #                           （C1\tC5\nB3\tC5\nのような2行4つのセル番地で1つの状態遷移表の罫線範囲を表す）
    # v_new_tableinfo_union.tsv: セル結合の対象となるセル範囲の一覧
    #                           （A1\tC5\nのような2つのセル番地で1つの範囲を表す）
    # jotaisenni.tsv           : 状態遷移表を構成する文字列とそれらが出力されるセル番地の一覧

    # ############################


    tablecolumns = []
    color_jotaisennis =[]
    v_new_tableinfos = []
    v_new_tableinfo_unions = []

    if os.path.exists("TSV_info/stm_report_message.txt"):
        fi = open("TSV_info/stm_report_message.txt", "r")
        messages = fi.readlines()
        message_rownum = len(messages)
        fi.close()
    else:
        message_rownum = 0

    startcol = ord('B')
    #(changed 2017_0330_wakabayashi)
    # 警告・エラー文の行数に応じて状態遷移表作成の起点を下にずらす
    #startrow = 3
    startrow = 3 + message_rownum
    outlist = list()

    for funcnum,funcname in enumerate(funcnames):

        out_directory = "temp/" + directory + "/" + funcname + "/"
        rfile = out_directory + "stm_tablecolumn.tsv"
        fi = open(rfile)
        tablecolumn = fi.readlines()
        fi.close()

        event_deepest_nest = 1

        out_directory = "temp/" + directory + "/" + funcname + "/"
        rfile = out_directory + "stm_eventlist.tsv"
        fi = open(rfile)
        events = fi.readlines()
        for event in events:
            nest = int(event.split("\t")[2])
            if nest > event_deepest_nest:
                event_deepest_nest = nest
        fi.close()

        #Excelに対応するためにセルアドレスを求める
        #まずは未結合と色情報ファイルを作成する

        if funcnum != 0:
            startrow = maxrow + 2

        for i, tc in enumerate(tablecolumn): # tc is each column
            tc = tc.split("\t")
            tc = ["" if "###NONE###" in tc_element else tc_element for tc_element in tc]

            for j,t in enumerate(tc):
                col = chr(startcol + i)
                row = str(startrow + j)
                cell = col+row
                if t == "":
                    t = " "
                if t == None:
                    t = " "
                if param in t and param != t:
                    color_jotaisennis.append(cell)
                outlist.append(cell+"\t"+cell+"\t"+t)
        maxcol = i + startcol
        maxrow = j + startrow


        #罫線ファイル
        cell1 = chr(startcol)+str(startrow+2)
        cell2 = chr(maxcol)+str(maxrow)
        print(cell1 + "\t" + cell2, end="\n")
        v_new_tableinfos.append(cell1 + "\t" + cell2)

        #(changed 2017_0321_wakabayashi)
        #cell1 = chr(startcol+2)+str(startrow)
        cell1 = chr(startcol+event_deepest_nest+1)+str(startrow)
        cell2 = chr(maxcol)+str(maxrow)
        print(cell1 + "\t" + cell2, end="\n")
        v_new_tableinfos.append(cell1 + "\t" + cell2)

        #(added 2017_0324_wakabayashi)
        #状態変数名セルの結合用
        cell1 = chr(startcol+2)+str(startrow)
        cell2 = chr(maxcol)+str(startrow)
        print(cell1 + "\t" + cell2)
        v_new_tableinfo_unions.append(cell1 + "\t" + cell2)

        # addedここまで


        ##本体TSVの作成：結合
        outlist2 = list()
        i = 0
        print("outlist",outlist)
        while i < len(outlist):
            ol = outlist[i]
            row = ol.split("\t")

            #最終行に対する処理
            if i == len(outlist) - 1:
                row = ol.split("\t")
                ol = ol.replace("if(%%%MJK%%%){$$NL$$  ", "")
                ol = ol.replace("$$NL$$}", "")
                #ol = ol[:-7]
                outlist[i] = ol
                break
            #結合検出
            ol_next = outlist[i+1]
            row_next = ol_next.split("\t")

            row_col1 = row[0][0]
            row_col2 = row[1][0]
            row_next_col1 = row_next[0][0]
            row_next_col2 = row_next[1][0]



    #        if row[2] == row_next[2]:
            if row[2] == row_next[2] and row_col1==row_col2==row_next_col1==row_next_col2:
                cell1 = row[0]
                cell2 = row[1][0] + str(int(row[1][1:])+1)  #行アドレスのインクリメント
                if "if(%%%MJK%%%){" in row[2]:
                    row[2] = row[2].replace("if(%%%MJK%%%){$$NL$$", "")
                    row[2] = row[2][:-1]
                    row[2] = row[2].replace("$$NL$$}", "")
                outlist[i] = cell1+"\t"+cell2+"\t"+row[2]
                #print(outlist[i])
                outlist.pop(i+1)
                i -= 1
            else:
                if "if(%%%MJK%%%){" in row[2]:
                    row[2] = row[2].replace("if(%%%MJK%%%){$$NL$$", "")
                    row[2] = row[2].replace("$$NL$$}", "")
                    if "if(" not in row[2]:
                        row[2] = row[2].replace("  ", "")
                        row[2] = row[2].replace("  ", "")
                    print(row[2])
                    row[2].replace("}","",1)
                    outlist[i] = row[0]+"\t"+row[1]+"\t"+row[2]
            i += 1


    fo = open("TSV_info/color_jotaisenni.tsv", "w")
    for cj in color_jotaisennis:
        print(cj,file=fo,end="\n")
    fo.close()

    fo = open("TSV_info/v_new_tableinfo.tsv", "w")
    for vn in v_new_tableinfos:
        print(vn,file=fo,end="\n")
    fo.close()


    fo = open("TSV_info/v_new_tableinfo_union.tsv", "w")
    for vnu in v_new_tableinfo_unions:
        print(vnu,file=fo,end="\n")
    fo.close()

    fo = open("TSV_info/jotaisenni.tsv", "w")
    print("---------From Here---------")
    for ol in outlist:
        print(ol)
        #(changed 2017_0321_wakabayashi)
        #状態値ELSEの表記を小文字elseに置換
        if re.match(".+\t.+\tELSE",ol) :
            print(ol.replace("ELSE","else"), file=fo, end="\n")
        else:
            print(ol,file=fo,end="\n")
    fo.close()



    #exit()
if __name__ == '__main__':
    trans2celladds(sys.argv[1],sys.argv[2])
