/* eslint @typescript-eslint/no-explicit-any: 0 */

// パッケージ側 augmentation の opt-in（アプリが実際に配線しているものだけ読み込む）
import '@ablogcms/deprecated/acms';
import '@ablogcms/dialog/acms';
import '@ablogcms/drawer/acms';
import '@ablogcms/events/acms';
import '@ablogcms/lib/acms';
import '@ablogcms/media/acms';
import '@ablogcms/modal/acms';
import '@ablogcms/notify/acms';
import '@ablogcms/pending/acms';
import '@ablogcms/plugins/acms';
import '@ablogcms/resize-image/acms';
import '@ablogcms/unit-editor/acms';
import '@ablogcms/url/acms';

interface Dispatch {
  (context: HTMLElement | Document | JQuery): void;
  validator: (
    form: HTMLFormElement,
    options?: Partial<import('@ablogcms/validator/types').ValidatorOptions>
  ) => Promise<import('@ablogcms/validator').default>;
  [key: string]: any;
}

// アプリ内部専用メンバーの追記。built-in/lib はパッケージ化されていないため、
// 公開型には出さずアプリ内でのみ厳密化する（外部からは @ablogcms/types/acms の
// index signature で any のまま扱われる）。
declare module '@ablogcms/types/acms' {
  interface Acms {
    Dispatch: Dispatch;
    Dispatch2: (context: HTMLElement | Document) => void;
    Load: any;
    /**
     * @deprecated `ACMS.dispatchEvent`/`addListener` が内部で使う後方互換用の再生プール（イベント名 →
     * 発火済みイベントの配列）です。新設の `ACMS.events` は同種の再生を意図的に持ちません
     * （HOOKS.md「登録タイミング制約」参照）。直接参照せず `ACMS.events` へ移行してください。
     */
    eventPool: Record<string, Array<{ event: CustomEvent }>>;
  }

  interface AcmsLibrary {
    validator: typeof import('../built-in/lib/validator').default;
    tab: typeof import('../built-in/lib/tab').default;
  }

  // 現行 acms.d.ts の Config フィールドのうち、ベース（root/scriptRoot/bid/ARCHIVES_DIR/auth）と
  // url パッケージ（segments）が持つもの以外をすべてここへ移設する。
  //
  // i18n はベース（@ablogcms/types/acms）の構造的シグネチャのまま据え置く。TypeScript の
  // 宣言マージは同名プロパティの型を後から狭められないため（TS Issue #40904）、
  // i18next.TFunction への厳密化はここではできない。
  interface AcmsConfig {
    offset: string;
    jsDir: string;
    themesDir: string;
    MEDIA_ARCHIVES_DIR: string;
    HTTP_MEDIA_ARCHIVES_DIR: string;
    MEDIA_STORAGE_DIR: string;
    aid?: string;
    cid?: string;
    uid?: string;
    eid?: string;
    rvid?: string;
    rid: string;
    mid: string;
    setId: string;
    bcd: string;
    ccd: string;
    ecd: string;
    suid?: string;
    admin: string;
    keyword: string;
    dbCharset?: string;
    domains?: string;
    /**
     * プレビュー / タイムマシンの DeviceMode と、プレビュー対象ページ側の window.postMessage の
     * origin 検証専用（scheme://host[:port] 形式）。ablogcms/php/Services/Common/Helper.php の
     * getManagedOrigins() が Login::isLoggedIn() / Preview::isPreviewMode() /
     * Preview::isPreviewShareAdmin() のいずれかのレンダーでのみ公開する。
     */
    previewAllowedOrigins?: string[];
    edition?: 'standard' | 'professional' | 'enterprise';
    fulltimeSSL: '1' | '0';
    jQuery: string;
    jQueryMigrate: string;
    jpegQuality?: string;
    jsRoot: string;
    mfu?: string;
    pms?: string;
    rootTpl?: string;
    searchEngineKeyword: string;
    timemachinePreviewDefaultDevice?: string;
    timemachinePreviewHasHistoryDevice?: string;
    fileiconDir: string;
    uaGroup: string;
    umfs?: string;
    urlPreviewExpire?: string;
    v: string;
    timeMachineMode?: 'true';
    multiDomain: '1' | '0';
    cache?: string;
    hash: string;
    limitOptions?: string[];
    defaultLimit?: string;
    entryEditPageType?: 'admin' | 'front' | 'normal';
    isDebugMode: '1' | '0';
    Gmap: {
      sensor: 'true' | 'false';
    };
  }
}
