# -*- mode: python ; coding: utf-8 -*-

import sys
import os
from PyInstaller.utils.hooks import collect_submodules, collect_data_files

# ========================================================
# 1. 工程配置区 (Project Config)
# ========================================================
block_cipher = None
ENTRY_POINT = 'runDecoder.py'
APP_NAME = 'Depression_Decoder'

# ========================================================
# 2. 依赖分析 (Dependency Analysis)
# ========================================================
# 收集 mne, sklearn, scipy 可能遗漏的隐藏导入
hidden_imports = [
    'infer_pth',          # 你的动态导入模块
    'sklearn.utils._cython_blas', 
    'sklearn.neighbors.typedefs',
    'sklearn.neighbors.quad_tree',
    'sklearn.tree',
    'sklearn.tree._utils',
]
# 自动收集 mne 的子模块
hidden_imports += collect_submodules('mne')
# 收集 torch 相关的隐式导入（虽然 PyInstaller 通常能处理，但显式更安全）
hidden_imports += ['torch', 'torchvision']

# ========================================================
# 3. 资源锚定 (Data Anchoring)
# ========================================================
# Analysis 中的 datas 用于将文件嵌入到内部（运行时在临时目录或 _internal）
# 这里我们留空，改为在 COLLECT 阶段通过 Tree 显式复制到 EXE 旁，
# 这样生成的文件夹里能直接看到 model 和 raw_data
datas = []

# 收集 mne 的数据文件（如果需要默认配置）
datas += collect_data_files('mne')

# ========================================================
# 4. 构建流程 (Build Process)
# ========================================================
a = Analysis(
    [ENTRY_POINT],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=hidden_imports,
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=['tkinter', 'PyQt5', 'PySide2', 'IPython'], # 排除 GUI 和交互式库减小体积
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name=APP_NAME,
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=False,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

# ========================================================
# 5. 打包模式: OneDir (单文件夹) + 资源旁路
# ========================================================
# 使用 Tree 将文件夹原样复制到 dist/APP_NAME/ 下
# 格式: Tree('源路径', prefix='目标子目录')

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=False,
    upx_exclude=[],
    name=APP_NAME,
)
