import os
import sys
import tkinter as tk
from tkinter import filedialog

extension = ".hs"
exportFileName = "MargeHSFiles"+extension

def select_output_directory():
    """ ユーザーに保存先フォルダを選択させる """
    root = tk.Tk()
    root.withdraw()  # メインウィンドウを非表示にする
    root.attributes('-topmost', True)  # 最前面に設定
    selected_directory = filedialog.asksaveasfilename(
        title="ファイルを選択してください（フォルダを得るための仮ファイル選択）",
        initialdir=".",
        defaultextension=extension,
        filetypes=[("Script Files", "*"+extension), ("All Files", "*.*")]
    )
    
    root.destroy()  # ウィンドウを閉じる
    return selected_directory

def find_hs_files(root_dir):
    """ 指定されたディレクトリ以下の全てのファイルを検索する """
    hs_files = []
    for dirpath, _, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename.endswith(extension) and filename != exportFileName:  # 自身を除外
                hs_files.append(os.path.join(dirpath, filename))
    return hs_files

def merge_hs_files(hs_files, output_file):
    """ 見つかったファイルを1つのファイルに統合する """
    with open(output_file, "w", encoding="utf-8") as outfile:
        for file in hs_files:
            fileName = file.replace(os.getcwd(), '')
            print(f"マージ中: {fileName}")
            with open(file, "r", encoding="utf-8") as infile:
                outfile.write(f"// --- {fileName} ---\n")
                outfile.write(infile.read() + "\n\n")
                infile.close()
    print(f"\n統合完了: {output_file}")

def select_merge_mode():
     # 出力モードを選択
    print("\n出力先を選択してください:")
    print("1. バッチファイルの起動場所に保存")
    print("2. 手動で保存先を指定")
    choice = input("選択 (1 / 2): ").strip()

    return choice

def get_select_mode_by_comandline():
    select_mode = 0

    if len(sys.argv) >= 3:

        if sys.argv[1] == "-t" or sys.argv[1] == "-type":
            select_mode = sys.argv[2]

            if(select_mode != "1" and select_mode != "2"):
                select_mode = 0
    
    return select_mode


if __name__ == "__main__":
    root_directory = os.getcwd()
    print(f"検索開始: {root_directory}")
    
    hs_files = find_hs_files(root_directory)
    
    if not hs_files:
        print("結合する" + extension + "ファイルが見つかりませんでした。")
    else:
        choice = get_select_mode_by_comandline()

        if choice == 0:
            choice = select_merge_mode()

        while choice != "1" and choice != "2":
            print("無効な選択です。")
            choice = select_merge_mode()
        
        output_directory = root_directory
        if choice == "1":
            output_directory = root_directory + "/Build/" + exportFileName
        elif choice == "2":
            output_directory = select_output_directory()

        # 親ディレクトリが存在しない場合は作成
        parent_dir = os.path.dirname(output_directory)
        if not os.path.exists(parent_dir):
            os.makedirs(parent_dir)
            print(f"ディレクトリを作成しました: {parent_dir}")

        if not os.path.exists(output_directory):
            # ファイルが存在しなければ作成
            with open(output_directory, 'w', encoding='utf-8') as f:
                pass  # 空ファイルを作成
            print(f"新規ファイルを作成しました: {output_directory}")
        else:
            print(f"既存ファイルが選択されました: {output_directory}")

        output_flie = output_directory

        merge_hs_files(hs_files, output_flie)
