/*:
 * @target MZ
 * @plugindesc [最終安定版] スイッチ1002を全セーブデータで共有（global.rmmzsave使用・localStorage完全不使用・安全対応）
 * @author you
 *
 * @help
 * ■ 概要
 * スイッチID 1002 を全セーブデータ・新規ゲームで共通化します。
 * RPGツクールMZ標準の global.rmmzsave に保存されます。
 *
 * ■ 保存先
 *   ./save/global.rmmzsave
 *
 * ■ 特徴
 * ・localStorage は一切使用しません。
 * ・save フォルダが無くても自動生成されます。
 * ・ツクールの StorageManager が初期化された後にのみアクセス。
 * ・新規ゲーム、ロード、セーブ、終了時に自動同期。
 *
 * ■ 注意
 * ・PC / NW.js専用（ブラウザでは動作しません）。
 * ・共有スイッチを初期化したい場合は save/global.rmmzsave を削除してください。
 */

(() => {
  const SWITCH_ID = 1002;
  const GLOBAL_KEY = "SharedSwitch1002";

  // ============================================================
  // ファイル安全ヘルパ
  // ============================================================
  function ensureSaveFolder() {
    const fs = require("fs");
    const path = require("path");
    const base = path.dirname(process.mainModule.filename);
    const dir = path.join(base, "save");
    if (!fs.existsSync(dir)) fs.mkdirSync(dir);
    return dir;
  }

  function readGlobalFile() {
    const fs = require("fs");
    const path = require("path");
    const dir = ensureSaveFolder();
    const file = path.join(dir, "global.rmmzsave");
    try {
      if (!fs.existsSync(file)) return {};
      const data = fs.readFileSync(file, "utf8");
      const json = LZString.decompressFromBase64(data);
      return JSON.parse(json) || {};
    } catch (e) {
      console.warn("[SharedSwitch1002] 読み込み失敗:", e);
      return {};
    }
  }

  function writeGlobalFile(obj) {
    const fs = require("fs");
    const path = require("path");
    const dir = ensureSaveFolder();
    const file = path.join(dir, "global.rmmzsave");
    try {
      const json = JSON.stringify(obj || {});
      const compressed = LZString.compressToBase64(json);
      fs.writeFileSync(file, compressed, "utf8");
    } catch (e) {
      console.error("[SharedSwitch1002] 保存失敗:", e);
    }
  }

  // ============================================================
  // 実際の同期処理
  // ============================================================
  function importSharedSwitch() {
    if (!$gameSwitches) return;
    try {
      const global = readGlobalFile();
      if (Object.prototype.hasOwnProperty.call(global, GLOBAL_KEY)) {
        $gameSwitches.setValue(SWITCH_ID, global[GLOBAL_KEY]);
      }
    } catch (e) {
      console.warn("[SharedSwitch1002] import error:", e);
    }
  }

  function exportSharedSwitch() {
    if (!$gameSwitches) return;
    try {
      const global = readGlobalFile();
      global[GLOBAL_KEY] = $gameSwitches.value(SWITCH_ID);
      writeGlobalFile(global);
    } catch (e) {
      console.warn("[SharedSwitch1002] export error:", e);
    }
  }

  // ============================================================
  // フック（StorageManager初期化後にのみ発動）
  // ============================================================
  const _DataManager_setupNewGame = DataManager.setupNewGame;
  DataManager.setupNewGame = function() {
    _DataManager_setupNewGame.call(this);
    setTimeout(importSharedSwitch, 10); // 10ms遅延してStorageManager初期化を待つ
  };

  const _DataManager_extractSaveContents = DataManager.extractSaveContents;
  DataManager.extractSaveContents = function(contents) {
    _DataManager_extractSaveContents.call(this, contents);
    setTimeout(importSharedSwitch, 10);
  };

  const _DataManager_makeSaveContents = DataManager.makeSaveContents;
  DataManager.makeSaveContents = function() {
    const contents = _DataManager_makeSaveContents.call(this);
    setTimeout(exportSharedSwitch, 10);
    return contents;
  };

  const _SceneManager_terminate = SceneManager.terminate;
  SceneManager.terminate = function() {
    setTimeout(exportSharedSwitch, 10);
    _SceneManager_terminate.call(this);
  };
})();
