using Microsoft.UI.Text;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;

namespace YMhut.Box.WinUI.Views;

public sealed class PluginDocsPage : Page
{
    private readonly Action? _goBack;

    public PluginDocsPage(Action? goBack = null)
    {
        _goBack = goBack;
        Background = ModernUi.AppBackground;
        Content = BuildContent();
    }

    private UIElement BuildContent()
    {
        var root = new Grid
        {
            Padding = new Thickness(32, 24, 32, 32),
            RowSpacing = 16
        };
        root.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
        root.RowDefinitions.Add(new RowDefinition());

        var back = ModernUi.IconButton("\uE72B", "返回插件页", () => _goBack?.Invoke());
        var headerText = new StackPanel
        {
            Spacing = 4,
            Children =
            {
                ModernUi.Text("插件开发与安全说明", 32, FontWeights.SemiBold),
                ModernUi.Text("本地插件用于扩展工具箱和独立插件页面。插件必须声明权限、保持资源在插件目录内，并通过 YMhut Bridge 访问宿主能力。", 14, foreground: ModernUi.TextSecondary, maxLines: 3)
            }
        };

        var header = new Grid { ColumnSpacing = 12 };
        header.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
        header.ColumnDefinitions.Add(new ColumnDefinition());
        header.Children.Add(back);
        Grid.SetColumn(headerText, 1);
        header.Children.Add(headerText);
        root.Children.Add(ModernUi.Card(header, new Thickness(14), radius: 8));

        var docs = new StackPanel { Spacing = 12 };
        docs.Children.Add(Section("1. 插件包结构", """
默认插件目录位于 %LocalAppData%\YMhut Box\WinUI\Plugins，也可以在设置页改为自定义目录。

每个子文件夹代表一个插件包，最少需要：
my-plugin/
  ymhut.plugin.json
  README.md
  index.html
  style.css
  main.js

README.md、README.txt 或 说明.md 必须存在。插件卡片展示名称以 manifest 的 name 为准，文件夹名只用于本地包隔离。
"""));
        docs.Children.Add(Section("2. manifest 字段", """
id：插件唯一 ID，只允许字母、数字、点、短横线和下划线，不能以 plugin: 开头。
name / version / author / description：插件卡片和详情页展示信息。
entry：默认 HTML 入口，相对插件目录。
permissions：希望使用的能力列表；声明不等于授权，用户仍需在插件页开启。
surfaces：挂载入口，当前支持 ToolboxTool 和 NavPage。
resources：插件资源白名单，路径必须留在插件目录内。
builtIn：仅内置示例使用，第三方插件不要设置。
"""));
        docs.Children.Add(Section("3. surface 与运行入口", """
ToolboxTool：挂载到工具箱，工具 ID 形如 plugin:<pluginId>:<surfaceId>。
NavPage：显示在插件页，可作为插件主页面或控制台。

surface.entry 可覆盖 manifest.entry；未填写时使用 manifest.entry。插件页面加载在独立 WebView 用户数据目录中，和安全浏览器、普通工具 WebView 分开。
"""));
        docs.Children.Add(Section("4. 权限模型", """
权限默认关闭。manifest 只说明插件想使用什么，真正运行时需要用户启用插件并授予对应权限。

Input：读取/写入插件输入。
Output：写入宿主输出区，输出区在插件内容下方，不应遮挡插件主界面。
Log：写入 plugin:<pluginId> 日志分类。
Storage：访问当前插件命名空间下的 key-value 状态。
Http：通过宿主 HTTP 服务请求 http/https。
Clipboard：读写剪贴板文本。
FilePicker：通过系统选择器打开或保存文件，不开放任意路径读写。
RunTool：调用允许的内置工具。
OpenExternal：打开 http/https 外链，默认进入安全浏览器。
NetworkDiagnostics：读取本机网络诊断、ping、DNS、trace route 等宿主诊断能力。
"""));
        docs.Children.Add(Section("5. JS Bridge", """
window.ymhut.input.get()
window.ymhut.input.set(value)
window.ymhut.output.set(value)
window.ymhut.output.append(value)
window.ymhut.output.clear()
window.ymhut.log.info(message, detail?)
window.ymhut.log.warn(message, detail?)
window.ymhut.log.error(message, detail?)
window.ymhut.storage.get(key)
window.ymhut.storage.set(key, value)
window.ymhut.storage.remove(key)
window.ymhut.storage.list()
window.ymhut.http.fetch(urlOrRequest)
window.ymhut.network.diagnostics()
window.ymhut.network.ping(request)
window.ymhut.network.dnsLookup(request)
window.ymhut.network.traceRoute(request)
window.ymhut.clipboard.readText()
window.ymhut.clipboard.writeText(text)
window.ymhut.file.openPicker()
window.ymhut.file.savePicker(name, value)
window.ymhut.tool.run(toolId, input)
window.ymhut.openExternal(url, { target?: "safe" | "system" })

openExternal 默认打开应用内安全浏览器。只有显式传入 { target: "system" } 才尝试打开系统浏览器，并且仍需要 OpenExternal 权限。
"""));
        docs.Children.Add(Section("6. 独立窗口、输出区与遮挡", """
插件可以作为工具箱工具或插件页运行。需要脱离主窗口时，应使用宿主提供的独立窗口入口，而不是自行弹出浏览器或远程窗口。

插件的主要 UI 应在 WebView 内容区内完成。window.ymhut.output.* 写入的是宿主输出区，适合报告、日志摘要、可复制结果，不适合持续覆盖主操作面板。

避免使用全屏 fixed 遮罩、超高 z-index、透明点击层或模拟系统标题栏。确实需要模态交互时，应提供明显关闭按钮，并保证键盘焦点能返回主内容。
"""));
        docs.Children.Add(Section("7. 安全边界", """
插件 WebView 只允许加载插件目录内的 file:// 资源；非本地导航会被拦截并交给安全浏览器。
插件不能覆盖内置工具 ID、应用图标、开发者信息、关于页核心身份或内置 Assets 路径。
插件不能通过相对路径逃逸插件目录，resources、entry 和 surface.entry 都会被校验。
文件能力只通过系统选择器提供，不开放静默任意路径读写。
网络能力经权限控制和宿主服务代理，插件应展示失败状态，不应假装远程数据一定可信。
"""));
        docs.Children.Add(Section("8. 常见问题", """
加载失败：检查 ymhut.plugin.json、README、entry 文件是否存在，路径是否在插件目录内。
权限拒绝：确认 manifest 声明了权限，并在插件页为该插件授权。
外链打不开：只支持绝对 http/https URL；默认在安全浏览器打开。
输出遮挡内容：不要用 output 区承载主 UI，把它当作报告和日志摘要。
独立窗口异常：确认插件入口没有依赖主窗口 DOM，也不要调用浏览器弹窗 API 创建 Edge/系统私密窗口。
网络结果为空：Http 或 NetworkDiagnostics 权限可能未授予，或远程端点不可用，插件应给出降级提示。
"""));
        docs.Children.Add(Section("9. 给 AI/自动化实现者的约束", """
生成插件时请优先创建最小可运行包：manifest、README、index.html、style.css、main.js。
不要请求不需要的权限；每个权限都应在 README 中说明用途。
不要下载远程脚本作为运行依赖；可用远程 API 获取数据，但 UI 和核心逻辑应随插件包本地发布。
不要修改 server/、内置 Assets、开发者资料或应用核心页面。
链接跳转默认使用 window.ymhut.openExternal(url)，系统浏览器仅作为显式动作。
为窄窗口、独立窗口和无网络状态提供清晰布局与空态。
"""));

        var scroll = new ScrollViewer
        {
            Content = docs,
            VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
            HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled
        };
        Grid.SetRow(scroll, 1);
        root.Children.Add(scroll);
        return root;
    }

    private static Border Section(string title, string body)
    {
        return ModernUi.Card(new StackPanel
        {
            Spacing = 8,
            Children =
            {
                ModernUi.Text(title, 20, FontWeights.SemiBold),
                new TextBlock
                {
                    Text = body,
                    TextWrapping = TextWrapping.Wrap,
                    IsTextSelectionEnabled = true,
                    FontSize = 14,
                    Foreground = ModernUi.TextSecondary,
                    FontFamily = new FontFamily("Cascadia Mono")
                }
            }
        }, new Thickness(16), radius: 8);
    }
}
