import { ElectronAPI } from '@electron-toolkit/preload'
import { Contact, Message } from '../shared/types'
import { GroupReportExportRequest, GroupReportExportResult } from '../shared/group-report'

export type ParsedContent =
  | { type: 'text'; content: string }
  | { type: 'voice'; duration?: number }
  | { type: 'location'; poiname?: string; label?: string; lat: number; lng: number }
  | { type: 'card'; username: string; nickname: string; avatarUrl?: string }
  | { type: 'share'; title: string; des?: string; url: string; appname?: string; type?: string }
  | { type: 'voip'; duration?: number; status: string; roomType?: number }
  | { type: 'image'; md5?: string; datName?: string; aeskey?: string; encrypVer?: number }
  | {
      type: 'sticker'
      md5?: string
      url?: string
      thumbUrl?: string
      encryptUrl?: string
      aeskey?: string
    }
  | {
      type: 'quote'
      title?: string
      content?: string
      sender?: string
      quotedContent?: string
      quotedSender?: string
      quotedType?: string
    }
  | { type: 'system'; content: string }
  | { type: 'unknown'; raw: string }

declare global {
  interface Window {
    electron: ElectronAPI
    api: {
      initDb: (
        key: string
      ) => Promise<boolean | { success: boolean; error?: string; monitoring?: boolean }>
      getContacts: (filter?: string) => Promise<Contact[]>
      getMessages: (userMd5: string, startTime?: number, endTime?: number) => Promise<Message[]>
      getGroupSnapshot: (userMd5: string) => Promise<{
        roomId: string
        memberCount: number
        members: { wxid: string; nickname: string; avatar: string }[]
      } | null>
      search: (keyword: string) => Promise<string | null>
      aiChat: (
        messages: { role: string; content: string }[],
        options?: { apiKey?: string; model?: string; baseURL?: string }
      ) => Promise<{ success: boolean; data?: string; error?: string }>
      copyImage: (base64String: string) => Promise<{ success: boolean; error?: string }>
      getVoiceData: (
        sessionId: string,
        localId: number,
        createTime: number,
        svrId?: string | number
      ) => Promise<{ success: boolean; data?: string; error?: string }>
      parseMessage: (content: string, messageType: number) => Promise<ParsedContent>
      getImage: (
        imageMd5?: string,
        imageDatNameOrThumb?: string | boolean,
        sessionId?: string
      ) => Promise<{ success: boolean; data?: string; error?: string }>
      getSticker: (
        cdnUrl?: string,
        md5?: string
      ) => Promise<{ success: boolean; data?: string; error?: string }>
      exportGroupReport: (request: GroupReportExportRequest) => Promise<GroupReportExportResult>
      revealGroupReport: (filePath: string) => Promise<{ success: boolean; error?: string }>
      getSavedDbKey: () => Promise<{ success: boolean; key?: string; error?: string }>
      autoGetDbKey: () => Promise<{
        success: boolean
        key?: string
        error?: string
        code?: string
        saved?: boolean
        warning?: string
      }>
      pasteAndSaveDbKey: () => Promise<{ success: boolean; key?: string; error?: string }>
      saveDbKey: (key: string) => Promise<{ success: boolean; key?: string; error?: string }>
      clearSavedDbKey: () => Promise<{ success: boolean; error?: string }>
      onWcdbChange: (callback: (payload: { type: string; json: string }) => void) => () => void
      onDbKeyStatus: (callback: (payload: { message: string }) => void) => () => void
      getSettings: () => Promise<{
        settings: {
          dbRoot: string
          apiEnabled: boolean
          apiHost: string
          apiPort: number
        }
        settingsPath: string
      }>
      setSettings: (patch: Partial<{
        dbRoot: string
        apiEnabled: boolean
        apiHost: string
        apiPort: number
      }>) => Promise<{
        settings: {
          dbRoot: string
          apiEnabled: boolean
          apiHost: string
          apiPort: number
        }
        settingsPath: string
      }>
      getSelf: () => Promise<
        | {
            ready: true
            info: { wxid: string; nickname: string; avatar?: string; accountRoot: string }
          }
        | { ready: false }
      >
      testConnection: (
        key: string,
        accountRoot?: string
      ) => Promise<{
        success: boolean
        error?: string
        accountRoot?: string
        wxid?: string
      }>
      reopenWithRoot: (accountRoot: string) => Promise<{
        success: boolean
        error?: string
        info?: { wxid: string; nickname: string; avatar?: string; accountRoot: string }
      }>
      apiStatus: () => Promise<{
        running: boolean
        host: string
        port: number
        error?: string
      }>
      apiStart: (
        host?: string,
        port?: number
      ) => Promise<{ running: boolean; host: string; port: number; error?: string }>
      apiStop: () => Promise<{ running: boolean; host: string; port: number; error?: string }>
      apiToggle: (enabled: boolean) => Promise<{
        running: boolean
        host: string
        port: number
        error?: string
      }>
    }
  }
}
