import { app, dialog } from 'electron'
import { execSync } from 'child_process'
import { unlinkSync, writeFileSync } from 'fs'
import { tmpdir } from 'os'
import { join } from 'path'

export type ShortcutKind = 'app' | 'edit' | 'publish'

export interface ShortcutResult {
  ok: boolean
  message?: string
}

function esc(s: string): string {
  return s.replace(/'/g, "''")
}

/** 弹出文件选择框，返回选中的工程 JSON 路径 */
export async function chooseProjectFile(): Promise<string | null> {
  const r = await dialog.showOpenDialog({
    title: '选择工程 JSON 文件',
    filters: [{ name: 'JSON 工程文件', extensions: ['json'] }],
    properties: ['openFile']
  })
  return r.canceled || !r.filePaths[0] ? null : r.filePaths[0]
}

/**
 * 创建桌面快捷方式：
 * - app：    直接打开本控制中心工具
 * - edit：   打开指定工程 JSON 并进入编辑状态（--project ... --mode edit）
 * - publish：打开指定工程 JSON 并默认进入发布状态（--project ... --mode publish）
 */
export function createDesktopShortcut(kind: ShortcutKind, projectPath?: string): ShortcutResult {
  try {
    const exe = process.execPath
    const appDir = app.getAppPath()
    let args: string
    let name: string
    if (kind === 'app') {
      args = `"${esc(appDir)}"`
      name = '智慧农业大数据可视化控制中心'
    } else {
      if (!projectPath) return { ok: false, message: '未指定工程文件' }
      const file = projectPath.replace(/^.*[\\/]/, '')
      const mode = kind === 'edit' ? 'edit' : 'publish'
      args = `"${esc(appDir)}" --project "${esc(projectPath)}" --mode ${mode}`
      name = `智慧农业控制中心（${mode === 'edit' ? '编辑' : '发布'}）- ${file.replace(/\.json$/i, '')}`
    }
    const script = [
      '$ws = New-Object -ComObject WScript.Shell',
      `$s = $ws.CreateShortcut([Environment]::GetFolderPath('Desktop') + '\\${esc(name)}.lnk')`,
      `$s.TargetPath = '${esc(exe)}'`,
      `$s.Arguments = '${esc(args)}'`,
      `$s.WorkingDirectory = '${esc(appDir)}'`,
      `$s.IconLocation = '${esc(exe)},0'`,
      '$s.Save()'
    ].join('\r\n')
    const psFile = join(tmpdir(), `sagc-shortcut-${Date.now()}.ps1`)
    // 写 UTF-8 with BOM，确保 PowerShell 5.1 正确解析中文
    writeFileSync(psFile, '\uFEFF' + script, 'utf8')
    execSync(`powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${psFile}"`, { timeout: 15000 })
    unlinkSync(psFile)
    return { ok: true, message: name }
  } catch (e) {
    return { ok: false, message: String(e) }
  }
}

/** 解析命令行参数（打包后：exe appDir --project <path> --mode edit/publish） */
export function parseArgv(argv: string[]): { project?: string; mode?: 'edit' | 'publish' } {
  const r: { project?: string; mode?: 'edit' | 'publish' } = {}
  for (let i = 0; i < argv.length; i++) {
    const a = argv[i]
    if (a === '--project' && argv[i + 1]) {
      r.project = argv[i + 1]
      i++
    } else if (a.startsWith('--project=')) {
      r.project = a.slice('--project='.length)
    } else if (a === '--mode' && argv[i + 1]) {
      r.mode = argv[i + 1] === 'publish' ? 'publish' : 'edit'
      i++
    } else if (a.startsWith('--mode=')) {
      r.mode = a.slice('--mode='.length) === 'publish' ? 'publish' : 'edit'
    }
  }
  return r
}
