import { useStore } from './store'
import { toast } from './toast'
import { pageSrc } from './utils'
import type { ScreenInfo } from './types'

export async function refreshScreens(): Promise<ScreenInfo[]> {
  const list = await window.api.screens.list()
  useStore.getState().setScreens(list)
  toast(`已检测到 ${list.length} 块可用显示屏幕`, 'ok')
  return list
}

/** 预览本页：将当前选中页面发布到指定屏幕 */
export async function publishCurrentToScreen(index: number): Promise<void> {
  const { pages, curIdx } = useStore.getState()
  const p = pages[curIdx]
  if (!p) return
  const url = pageSrc(p)
  await window.api.screens.publish({ index, url, title: p.title })
  const list = await window.api.screens.states()
  useStore.getState().setScreens(list)
  toast(`「${p.title}」已发布到 屏幕 ${index}（Esc 退出 · F5 刷新 · 数字键切页）`, 'ok')
}

/** 多屏发布：各页面按所在屏幕 ID 全屏播放；alsoMain 时编辑器屏幕也全屏显示对应页面 */
export async function publishAll(alsoMain = false): Promise<void> {
  const { pages } = useStore.getState()
  const screens = await window.api.screens.list()
  if (screens.length === 0) {
    toast('未检测到屏幕，请先检测屏幕', 'warn')
    return
  }
  let cnt = 0
  for (const s of screens) {
    const p = pages.find((x) => x.display && x.screen === s.index)
    if (p) {
      await window.api.screens.publish({ index: s.index, url: pageSrc(p), title: p.title })
      cnt++
    }
  }
  if (alsoMain) {
    const idx = await window.api.screens.mainIndex()
    const p = pages.find((x) => x.display && x.screen === idx)
    if (p) {
      await window.api.screens.publishMain({ url: pageSrc(p), title: p.title })
      cnt++
    } else {
      toast(`编辑器屏幕（屏幕 ${idx}）无匹配页面，未全屏显示`, 'warn')
    }
  }
  const list = await window.api.screens.states()
  useStore.getState().setScreens(list)
  toast(
    cnt > 0
      ? `多屏发布完成：${cnt} 个页面分发到 ${screens.length} 块屏幕`
      : '没有可发布的页面（请勾选「参与多屏发布」并设置屏幕 ID）',
    cnt > 0 ? 'ok' : 'warn'
  )
}

/** 关闭所有播放：关闭各屏幕窗口/轮播，并恢复编辑器主窗口 */
export async function closeAllScreenOutput(): Promise<void> {
  const list = await window.api.screens.closeAll()
  useStore.getState().setScreens(list)
  toast('已关闭所有播放页面', 'info')
}

/**
 * 单屏发布：在指定屏幕轮播所有「参与多屏发布」的页面。
 * 键盘：↑/↓ 或数字键切换，Esc 退出，F5 刷新。
 */
export async function startCarouselOnScreen(index: number, intervalSec = 0): Promise<void> {
  const { pages } = useStore.getState()
  const items = pages
    .filter((p) => p.display)
    .map((p) => ({ url: pageSrc(p), title: p.title }))
  if (items.length === 0) {
    toast('没有可发布的页面（请在编辑中勾选「参与多屏发布」）', 'warn')
    return
  }
  await window.api.carousel.start({ index, pages: items, intervalSec })
  const list = await window.api.screens.states()
  useStore.getState().setScreens(list)
  const auto = intervalSec > 0 ? ` · 自动切换 ${intervalSec}s` : ''
  toast(`屏幕 ${index} 单屏发布已启动（${items.length} 页${auto} · ↑/↓ 或数字键切换 · Esc 退出）`, 'ok')
}

export async function stopCarouselOnScreen(index: number): Promise<void> {
  const list = await window.api.carousel.stop(index)
  useStore.getState().setScreens(list)
  toast(`屏幕 ${index} 轮播已停止`, 'info')
}

/** 检测屏幕：各屏显示编号/分辨率标签 6 秒，并返回屏幕列表 */
export async function detectScreens(): Promise<ScreenInfo[]> {
  const list = await window.api.screens.probe()
  useStore.getState().setScreens(list)
  if (list.length === 0) toast('未检测到屏幕', 'warn')
  return list
}

/** 按「发布设置」的默认值发布当前工程（快捷方式③启动后自动调用） */
export async function applyPublishDefaults(): Promise<void> {
  const s = useStore.getState().settings
  if (!s) {
    toast('尚未加载设置，请稍后重试', 'warn')
    return
  }
  const p = s.publish
  const { pages } = useStore.getState()
  if (p.mode === 'single') {
    await startCarouselOnScreen(p.screenIndex, p.intervalSec)
  } else if (p.mode === 'main') {
    const first = pages.find((x) => x.display) ?? pages[0]
    if (!first) {
      toast('没有可发布的页面', 'warn')
      return
    }
    await window.api.screens.publishMain({ url: pageSrc(first), title: first.title })
    const list = await window.api.screens.states()
    useStore.getState().setScreens(list)
    toast(`编辑器屏幕已发布「${first.title}」`, 'ok')
  } else {
    await publishAll(p.alsoMain)
  }
}
