// 桌面端原生能力桥 —— 经 Wails 注入的 window.go.main.App 调 Go 方法。
// 关键：在浏览器预览（make web，无 Wails 运行时）下 window.go 不存在，
// 所有方法自动降级为纯 Web 行为，保证两种模式都能跑。

interface WailsApp {
  SaveReportAs(url: string, filename: string): Promise<string>;
  OpenReport(url: string, filename: string): Promise<void>;
  Notify(title: string, body: string): Promise<void>;
}

function app(): WailsApp | null {
  return ((window as unknown as { go?: { main?: { App?: WailsApp } } }).go?.main?.App as WailsApp) ?? null;
}

// isDesktop 是否运行在真实 Wails 桌面窗口（而非浏览器预览）。
export function isDesktop(): boolean {
  return !!app();
}

// isMacDesktop 用于交通灯让位等 macOS 专属适配。
export function isMacDesktop(): boolean {
  return isDesktop() && /Mac/i.test(navigator.userAgent);
}

// saveReportAs：桌面端弹原生"另存为"框落盘；浏览器降级为触发下载。返回保存路径（浏览器/取消为空）。
export async function saveReportAs(url: string, filename: string): Promise<string> {
  const a = app();
  if (!a) {
    triggerDownload(url, filename);
    return "";
  }
  return a.SaveReportAs(url, filename);
}

// openReport：桌面端下载到临时目录并用系统默认应用打开；浏览器降级为新标签打开。
export async function openReport(url: string, filename: string): Promise<void> {
  const a = app();
  if (!a) {
    window.open(url, "_blank");
    return;
  }
  return a.OpenReport(url, filename);
}

// notify：桌面端弹系统通知；浏览器为空操作（由应用内 Toast 兜底）。
export function notify(title: string, body: string): void {
  app()?.Notify(title, body);
}

// printReportHtml：把已渲染的报告 HTML 在打印视图里出 PDF（浏览器/Webview 的"打印→存为 PDF"）。
// 走前端打印是为了让中文(CJK)零字体依赖即可正确排版——后端 PDF 需内嵌 CJK 字体，较重。
export function printReportHtml(title: string, bodyHtml: string): boolean {
  const w = window.open("", "_blank", "width=840,height=1024");
  if (!w) return false; // 被弹窗拦截
  w.document.write(
    `<!doctype html><html><head><meta charset="utf-8"><title>${title}</title>` +
      `<style>` +
      `*{box-sizing:border-box}` +
      `body{font-family:-apple-system,system-ui,'PingFang SC','Microsoft YaHei',sans-serif;line-height:1.75;color:#111;max-width:760px;margin:36px auto;padding:0 28px}` +
      `h1{font-size:24px;margin:0 0 16px}h2{font-size:18px;margin:24px 0 8px}h3{font-size:15px}` +
      `p{margin:8px 0}ul,ol{margin:8px 0;padding-left:22px}` +
      `code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:#f4f4f5;border-radius:4px}` +
      `pre{padding:12px;overflow:auto}code{padding:1px 4px}` +
      `blockquote{margin:8px 0;padding-left:12px;border-left:3px solid #ddd;color:#555}` +
      `@media print{body{margin:0}}` +
      `</style></head><body>${bodyHtml}` +
      `<script>window.onload=function(){window.focus();window.print();};<\/script>` +
      `</body></html>`,
  );
  w.document.close();
  return true;
}

function triggerDownload(url: string, filename: string) {
  const el = document.createElement("a");
  el.href = url;
  el.download = filename;
  document.body.appendChild(el);
  el.click();
  el.remove();
}
