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

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

# ファイル名: senni.py
# 機能: 状態遷移表作成を開始する．
#	programsフォルダ内のpythonスクリプトを呼び出す． 
# 関数: 
# 著者名: 山本椋太，若林丈紘

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

import os
import sys
import re
import shutil
import argparse
from exception_handling import ReportException

# 外部 python ソース群
import split_funcs
import insert_mujoken
import add_else # added_170926
import add_mujoken_statement
import deletefunction
import exception_handling
import getjotaivalue
import makestm
import trans2celladds

if __name__ == '__main__':

    # オプション引数
    # jotai_value: 状態変数名
    # source_file: 対象のCファイル名
    # func: 状態変数がローカル変数の場合→関数名，グローバル変数の場合→"GLOBAL"
    parser = argparse.ArgumentParser()
    parser.add_argument('-j','--jotai_value',type=str,help='', required=True)
    parser.add_argument('-sf','--source_file',type=str,help='', required=True)
    parser.add_argument('-f','--func',type=str,help='', required=True)
    parser.add_argument('-sm','--stop_mode',\
                        default = "0",type=int,\
                        help='You can STOP after process \
                            [1:insert_mujoken][2:deletefunction][3:exceptionHandling][4:getjotaivalue][5:makestm]')
    arg = parser.parse_args()


    jval = arg.jotai_value
    func = arg.func
    sfile = arg.source_file

    funcnames = []
    fnames = []
    success_funcs = []
    
    # 対象ファイルsource_fileにある関数名を取り出す
    func_dic = split_funcs.split_funcs(sfile)

    
    warning_funcnames = []
    for ordernum,funcname in sorted(func_dic.items(),key=lambda x: x[0]):
        funcnames.append(funcname)
        print(funcname)

    # stm_report_message.txtは追加書き込みモードで開くので，前のファイルがある場合削除しておく
    if os.path.exists("TSV_info/stm_report_message.txt"):
        os.remove("TSV_info/stm_report_message.txt")

    # 以後，処理の入出力ファイルは関数ごとに分けて管理する
    for target_func in funcnames:

        print("FUNCNAME:",target_func,func,jval)
        dir_path = sfile + "/" +target_func

        insert_mujoken.insert_mujoken(jval,dir_path)
        # added_170926
        add_else.add_else(jval, target_func, dir_path)
        
        add_mujoken_statement.add_mujoken_statement(jval, target_func, dir_path)
#        print('addmjk')
#        exit()
        

        if arg.stop_mode == 1:
            exit()

        errorcheck = exception_handling.exception_handling(jval, dir_path)
        warning_funcnames.append(target_func)
        if errorcheck == False:
            continue

        if arg.stop_mode == 2:
            exit()
 
        # 状態変数がGLOBAL変数のとき，状態遷移表を作成できない関数があれば，除外して次の関数に移る
        if deletefunction.deletefunction(jval,func,dir_path) == False:
            continue

        if arg.stop_mode == 3:
            exit()

        getjotaivalue.getjotaivalue(jval,dir_path)
        
        if arg.stop_mode == 4:
            exit()

        makestm.makestm(jval,dir_path)

        if arg.stop_mode == 5:
            exit()
            
        success_funcs.append(target_func)

    if len(success_funcs)==0:
        print("ERROR: REVERSING FAILED for all functions .\n")
        ReportException("ERROR:全ての関数に対して状態遷移表を作成できませんでした。\n")
    
    # makestmの処理までたどり着いた関数名のリスト
    print("SUCCESS_FUNCS",success_funcs)
    
    trans2celladds.trans2celladds(jval,success_funcs,sfile)

    fo = open("temp/complete","w")
    print(jval,func,sfile,file=fo)
    fo.close()
