import { useRef, useEffect } from 'react'
import Taro, { useShareAppMessage, useShareTimeline } from '@tarojs/taro'
import { useUser } from './useUser'

export interface UseShareOptions {
  /** 分享标题 */
  title: string
  /** 分享给好友的完整 path（含或不含 query），如 /pages/shop/product-detail?id=123 */
  path?: string
  /** 朋友圈的 query（不含 page 与 ?），如 id=123，会被拼到当前页 path 之后 */
  query?: string
  /** 封面图（海报临时路径或网络图地址），不传则微信截取页面 */
  imageUrl?: string
  /** 是否注册朋友圈分享。tabBar 页亦可分享朋友圈（仅在朋友圈打开后的单页模式里 tabBar 不渲染，发起分享不受影响），默认 true */
  enableTimeline?: boolean
  /** 是否启用「复制链接」（右上角菜单复制链接按钮，基础库 2.14.3+ Beta）。开启后进入页面绑定、离开解绑 */
  enableCopyUrl?: boolean
}

/** 当前是否处于朋友圈单页模式（scene=1154） */
export function isTimelineSinglePage(): boolean {
  try {
    const options = Taro.getEnterOptionsSync()
    return options?.scene === 1154
  } catch {
    return false
  }
}

function buildPath(path: string | undefined, inviterId?: number | string): string {
  if (!path) return ''
  if (!inviterId) return path
  const sep = path.includes('?') ? '&' : '?'
  return `${path}${sep}inviter=${inviterId}`
}

function buildQuery(query: string | undefined, inviterId?: number | string): string {
  const parts: string[] = []
  if (query) parts.push(query)
  if (inviterId) parts.push(`inviter=${inviterId}`)
  return parts.join('&')
}

/**
 * 统一注册「分享给好友」「分享到朋友圈」「复制链接」回调。
 * 自动在 path/query 中追加 inviter（当前登录用户 id），用于分销裂变。
 * 朋友圈分享对 tabBar 页同样生效（朋友圈打开后为单页模式，tabBar 不渲染，但发起分享不受影响）。
 * 需在页面 config 中设置 enableShareAppMessage / enableShareTimeline: true 才会显示对应菜单。
 */
export function useShare(options: UseShareOptions) {
  const { user } = useUser()
  const inviterId = user?.id ?? user?.userId
  // 用 ref 保证分享触发时读取到最新 options（含异步生成的海报图）
  const optionsRef = useRef(options)
  optionsRef.current = options

  // 运行时保底：显式开启分享菜单按钮（即使页面 config 遗漏也能生效）
  useEffect(() => {
    const menus: Array<'shareAppMessage' | 'shareTimeline'> = ['shareAppMessage']
    if (optionsRef.current.enableTimeline !== false) {
      menus.push('shareTimeline')
    }
    Taro.showShareMenu({ menus })
  }, [])

  useShareAppMessage(() => {
    const o = optionsRef.current
    return {
      title: o.title,
      path: buildPath(o.path, inviterId),
      imageUrl: o.imageUrl,
    }
  })

  useShareTimeline(() => {
    if (optionsRef.current.enableTimeline === false) return {}
    const o = optionsRef.current
    return {
      title: o.title,
      query: buildQuery(o.query, inviterId),
      imageUrl: o.imageUrl,
    }
  })

  // 复制链接：进入页面绑定、离开解绑（全局监听，需手动管理避免影响其它页面）
  useEffect(() => {
    if (!options.enableCopyUrl) return
    if (typeof Taro.onCopyUrl !== 'function') return
    const handler = () => {
      const o = optionsRef.current
      return { query: buildQuery(o.query, inviterId), title: o.title }
    }
    Taro.onCopyUrl(handler)
    return () => {
      if (typeof Taro.offCopyUrl === 'function') Taro.offCopyUrl(handler)
    }
  }, [options.enableCopyUrl, inviterId])
}
