import json
import numpy as np
import pandas as pd
from PyQt6.QtGui import QColor

def _to_list(variable):
    """NumPy配列やpandasオブジェクトを安全にPythonリストに変換する"""
    if isinstance(variable, np.ndarray):
        return variable.tolist()
    elif isinstance(variable, (pd.DataFrame, pd.Series)):
        return variable.values.tolist()
    return list(variable) if hasattr(variable, "__iter__") and not isinstance(variable, str) else variable

def serialize_session(datasets, references, ui_settings, version):
    """データをJSON保存可能な辞書形式に変換する"""
    session_data = {
        "app_version": version,
        "ui_settings": ui_settings,
        "datasets": [],
        "references": []
    }

    # データセットの変換
    for ds in datasets:
        # グラフオブジェクトなどは除外してコピー
        ds_copy = {k: v for k, v in ds.items() if k not in ["line_object", "processed_y"]}
        ds_copy["x"] = _to_list(ds.get("x", []))
        ds_copy["original_y"] = _to_list(ds.get("original_y", []))
        
        if isinstance(ds_copy.get("color"), QColor):
            ds_copy["color"] = ds_copy["color"].name()

        # マーカー内の色変換
        if "markers" in ds_copy:
            for marker in ds_copy["markers"]:
                if isinstance(marker.get("color"), QColor):
                    marker["color"] = marker["color"].name()
        
        session_data["datasets"].append(ds_copy)

    # リファレンスの変換
    for ref in references:
        ref_copy = {k: v for k, v in ref.items() if k not in ["line_object", "display_data"]}
        ref_copy["positions"] = _to_list(ref.get("positions", []))
        ref_copy["intensities"] = _to_list(ref.get("intensities", []))
        
        if isinstance(ref_copy.get("color"), QColor):
            ref_copy["color"] = ref_copy["color"].name()
            
        session_data["references"].append(ref_copy)

    return session_data

def save_to_file(filepath, data):
    """JSONファイルとして保存"""
    with open(filepath, 'w', encoding='utf-8') as f:
        json.dump(data, f, indent=4, ensure_ascii=False)

def load_from_file(filepath):
    """JSONファイルから読み込み"""
    with open(filepath, 'r', encoding='utf-8') as f:
        return json.load(f)