import json
import tkinter as tk
from tkinter import filedialog


def explain_error(error_message):
    """英語のエラーメッセージを日本語の具体的な直し方に変換する関数"""
    err_str = str(error_message)

    # 💡 今回追加した「カンマが多い」ときのチェック
    if "trailing comma" in err_str.lower():
        return "👉 【直し方】末尾に余計なカンマ ( , ) が付いています。後ろに次のデータが続かない場合は、カンマを消してください。"

    elif "Expecting ',' delimiter" in err_str:
        return "👉 【直し方】前の項目の後ろに カンマ ( , ) が抜けているか、余計な文字が入っています。"
    elif "Expecting property name enclosed in double quotes" in err_str:
        return "👉 【直し方】キー（名前）がダブルクォーテーション ( \" ) で囲まれていないか、最後に余計なカンマ ( , ) が残っています。"
    elif "Expecting ':' delimiter" in err_str:
        return "👉 【直し方】キーと値の間にあるべき コロン ( : ) が抜けています。"
    elif "Expecting value" in err_str:
        return "👉 【直し方】コロンの後ろの値（データ）が空っぽになっているか、書き方が間違っています。"
    elif "Unterminated string" in err_str:
        return "👉 【直し方】文字を囲むダブルクォーテーション ( \" ) が途中で閉じられていません。"
    elif "Extra data" in err_str:
        return "👉 【直し方】JSONの全体を囲む カッコ { } や [ ] の外側に、余計な文字やデータがはみ出ています。"
    elif "Expecting" in err_str and ("}" in err_str or "]" in err_str):
        return "👉 【直し方】閉じカッコ ( } や ] ) が足りないか、対応するカッコの種類が間違っています。"

    return "👉 【直し方】記号の閉じ忘れ、カンマの過不足、または全角スペースなどが混じっていないか確認してください。"


def check_json_file(file_path):
    try:
        with open(file_path, "r", encoding="utf-8") as f:
            json.load(f)
        print(f"✅ OK: {file_path} は正しいJSONファイルです。")
        return True

    except FileNotFoundError:
        print(f"❌ エラー: ファイルが見つかりません。({file_path})")
        return False

    except json.JSONDecodeError as e:
        print(f"❌ NG: {file_path} のJSON形式にエラーがあります。")
        print(f"--------------------------------------------------")
        print(f"■ エラーの場所: {e.lineno}行目の {e.colno}文字目付近")
        print(f"■ 原因（英語）: {e.msg}")
        print(f"■ 対処法       : {explain_error(e)}")
        print(f"--------------------------------------------------")
        return False


def select_and_check_file():
    root = tk.Tk()
    root.withdraw()

    print("ファイル選択ダイアログを開いています...")

    file_path = filedialog.askopenfilename(
        title="チェックするJSONファイルを選択してください",
        filetypes=[("JSONファイル", "*.json"), ("すべてのファイル", "*.*")],
    )

    if file_path:
        check_json_file(file_path)
    else:
        print("キャンセルされました。")


if __name__ == "__main__":
    select_and_check_file()
