//
//  DouyinShare.swift
//  ylgamehall
//
//  抖音分享 SharePlatform 实现，1:1 对齐 daoqi msext DouyinShareManager
//  `shareWithContent:completion:`（按 type 分两个分支）：
//    - type == "2" → 截图分享：截图 → UIPasteboard → 弹"立即打开抖音"引导框
//    - else        → 文字分享：title + "\n\n" + desc → UIPasteboard → 弹引导框
//
//  **不依赖抖音 SDK**（CLAUDE.md ADR-006）：抖音的图片 / 文本分享原本就是
//  剪贴板 + 引导用户在抖音内粘贴的非 SDK 路径，新外壳照搬。
//
//  fire-and-forget：sharesuccess 已在 FriendsShareHandler 立即触发。
//

import UIKit
import os.log

@MainActor
public final class DouyinShare: SharePlatform {

    public static let shared = DouyinShare()

    private static let log = Logger(subsystem: "ylgamehall", category: "DouyinShare")

    private static let douyinScheme = "snssdk1128://"

    public let name = "Douyin"

    public var isInstalled: Bool {
        guard let url = URL(string: Self.douyinScheme) else { return false }
        return UIApplication.shared.canOpenURL(url)
    }

    public init() {}

    public func share(_ content: ShareContent, scene: ShareScene) {
        guard isInstalled else { return }

        if content.type == "2" {
            shareScreenshot()
        } else {
            shareText(content)
        }
    }

    // MARK: - 截图分享

    /// 对齐 msext DouyinShareManager.m:139-162 isScreenshotShare 分支：
    /// 截图 → pasteboard.image → 弹引导框（不自动拉起抖音，等用户点"立即打开"）。
    private func shareScreenshot() {
        do {
            let shot = try ImageProvider.captureScreenshot()
            UIPasteboard.general.image = shot
            Self.log.debug("DouyinShare 截图已复制到剪贴板")
        } catch {
            Self.log.error("DouyinShare 截图失败 \(error.localizedDescription, privacy: .public)")
            return
        }

        let message = """
        ✅ 图片已复制到剪贴板

        🎯 分享到好友或群聊步骤：
        1️⃣ 打开抖音，点击右下角「消息」
        2️⃣ 选择好友或群聊进入聊天
        3️⃣ 在输入框长按粘贴图片
        4️⃣ 点击发送即可分享
        """
        showGuidanceAlert(title: "抖音分享准备完成", message: message)
    }

    // MARK: - 文字分享

    /// 对齐 msext DouyinShareManager.m:163-196 else 分支：
    /// title + "\n\n" + desc 拼字符串 → pasteboard.string → 弹引导框。
    /// 双侧都空时用 msext 同款兜底文案"来自进贤聚友棋牌的精彩内容分享"。
    private func shareText(_ content: ShareContent) {
        var shareText = ""
        if !content.title.isEmpty {
            shareText = content.title
        }
        if !content.desc.isEmpty {
            shareText = shareText.isEmpty ? content.desc : "\(shareText)\n\n\(content.desc)"
        }
        if shareText.isEmpty {
            shareText = "来自进贤聚友棋牌的精彩内容分享"
        }
        UIPasteboard.general.string = shareText
        Self.log.debug("DouyinShare 文字已复制到剪贴板")

        let message = """
        ✅ 内容已复制到剪贴板

        🎯 分享到好友或群聊步骤：
        1️⃣ 打开抖音，点击右下角「消息」
        2️⃣ 选择好友或群聊进入聊天
        3️⃣ 在输入框长按粘贴内容
        4️⃣ 点击发送即可分享
        """
        showGuidanceAlert(title: "抖音分享准备完成", message: message)
    }

    // MARK: - 引导弹窗

    /// 弹"立即打开抖音 / 稍后分享"二选一 Alert，对齐 msext
    /// `showGuidanceAlertWithTitle:message:`。
    private func showGuidanceAlert(title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "立即打开抖音", style: .default) { _ in
            if let url = URL(string: Self.douyinScheme),
               UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
            }
        })
        alert.addAction(UIAlertAction(title: "稍后分享", style: .cancel))

        guard let topVC = Self.topViewController() else { return }
        topVC.present(alert, animated: true)
    }

    private static func topViewController() -> UIViewController? {
        let scene = UIApplication.shared.connectedScenes
            .compactMap { $0 as? UIWindowScene }
            .first(where: { $0.activationState == .foregroundActive })
            ?? UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.first
        guard var top = scene?.windows.first(where: \.isKeyWindow)?.rootViewController
                    ?? scene?.windows.first?.rootViewController else { return nil }
        while let presented = top.presentedViewController { top = presented }
        if let nav = top as? UINavigationController, let visible = nav.visibleViewController {
            return visible
        }
        return top
    }
}
