import { Schema } from "effect";
import { Expression } from "../../../../../share/expression.js";
import { Triggers } from "../../../../../share/event-bus.js";
import { md } from "../../../../../share/markdown.js";
export const type = "com.shwfed.actions.button.http.download";
export const compatibilityDate = "2026-05-21";
export const metadata = {
  name: "\u4E0B\u8F7D\u6587\u4EF6",
  icon: "fluent:arrow-download-20-regular"
};
export const JSON_VAR = {
  type: "dyn",
  label: "HTTP \u54CD\u5E94\u4F53",
  description: "\u7B2C\u4E00\u6B65 `\u8BF7\u6C42` \u7684\u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09\uFF1B\u7528\u4E8E\u6784\u9020\u7B2C\u4E8C\u6B65\u4E0B\u8F7D\u8BF7\u6C42"
};
function configureWithJson(configure) {
  return (env) => {
    configure(env);
    env.registerVariable("json", JSON_VAR.type, { description: JSON_VAR.description });
  };
}
export function schema(configure) {
  const CelHttpRequest = Expression({ configure, resultType: "HttpRequest" });
  const CelDownloadRequest = Expression({ configure: configureWithJson(configure), resultType: "HttpRequest" });
  const CelMessage = Expression({ configure: configureWithJson(configure), resultType: "string" });
  return Schema.Struct({
    type: Schema.Literal(type),
    compatibilityDate: Schema.Literal(compatibilityDate),
    template: Schema.Struct({
      request: CelHttpRequest.annotations({
        title: "\u8BF7\u6C42",
        description: md`
          返回 \`HttpRequest\` 的 CEL 表达式。未配置「下载请求」时直接作为文件下载请求；
          配置了「下载请求」时作为第一步请求，其响应体（JSON）通过 \`json\` 暴露给「下载请求」与状态表达式
        `
      }),
      download: Schema.optional(CelDownloadRequest.annotations({
        title: "\u4E0B\u8F7D\u8BF7\u6C42",
        description: md`
          可选的第二步：返回 \`HttpRequest\` 的 CEL 表达式，可通过 \`json\` 引用第一步的响应体，
          例如用 \`json.data.key\` 构造真正的下载请求
        `
      }))
    }).annotations({
      title: "\u4E0B\u8F7D",
      description: "\u70B9\u51FB\u540E\u53D1\u8D77 HTTP \u8BF7\u6C42\u5E76\u628A\u54CD\u5E94\u4FDD\u5B58\u4E3A\u672C\u5730\u6587\u4EF6"
    }),
    messageExpression: Schema.optional(CelMessage.annotations({
      title: "\u6D88\u606F",
      description: md`
        仅当配置了「下载请求」时生效；对第一步响应体（\`json\`）求值，返回 \`string\` 作为 toast 显示。
        不配置则不显示。未配置「下载请求」时被忽略。
      `
    })),
    resultExpression: Schema.optional(CelMessage.annotations({
      title: "\u6267\u884C\u7ED3\u679C",
      description: md`
        仅当配置了「下载请求」时生效；对第一步响应体（\`json\`）求值，返回 \`string\`。
        支持 \`'success' | 'warning' | 'error' | 'info'\`；其他值按 \`success\` 处理。不配置则按 \`success\` 处理。

        \`error\` 与 \`warning\` 会跳过实际的文件下载，只触发对应分支的操作；
        \`success\` 与 \`info\` 会继续执行「下载请求」并保存文件。

        它同时决定 toast 的样式，以及完成后执行下方哪一组操作。
      `
    })),
    onSuccess: Schema.optional(Triggers.annotations({
      title: "\u6210\u529F",
      description: "\u300C\u6267\u884C\u7ED3\u679C\u300D\u4E3A `success` \u65F6\uFF0C\u4E0B\u8F7D\u5B8C\u6210\u540E\u6267\u884C\u7684\u64CD\u4F5C\uFF1B\u672A\u914D\u7F6E\u300C\u4E0B\u8F7D\u8BF7\u6C42\u300D\u65F6\uFF0CHTTP \u6210\u529F\u5373\u89C6\u4E3A `success`"
    })),
    onWarning: Schema.optional(Triggers.annotations({
      title: "\u8B66\u544A",
      description: "\u300C\u6267\u884C\u7ED3\u679C\u300D\u4E3A `warning` \u65F6\u6267\u884C\u7684\u64CD\u4F5C\uFF1B\u8DF3\u8FC7\u5B9E\u9645\u7684\u6587\u4EF6\u4E0B\u8F7D"
    })),
    onError: Schema.optional(Triggers.annotations({
      title: "\u9519\u8BEF",
      description: "\u300C\u6267\u884C\u7ED3\u679C\u300D\u4E3A `error` \u65F6\u6267\u884C\u7684\u64CD\u4F5C\uFF1B\u8DF3\u8FC7\u5B9E\u9645\u7684\u6587\u4EF6\u4E0B\u8F7D"
    })),
    onInfo: Schema.optional(Triggers.annotations({
      title: "\u4FE1\u606F",
      description: "\u300C\u6267\u884C\u7ED3\u679C\u300D\u4E3A `info` \u65F6\uFF0C\u4E0B\u8F7D\u5B8C\u6210\u540E\u6267\u884C\u7684\u64CD\u4F5C"
    }))
  }).annotations({
    title: "HttpDownloadAction",
    description: "\u70B9\u51FB\u540E\u53D1\u8D77 HTTP \u8BF7\u6C42\u5E76\u628A\u54CD\u5E94\u4FDD\u5B58\u4E3A\u672C\u5730\u6587\u4EF6\uFF0C\u652F\u6301\u4E24\u6B65\u5F0F\uFF08\u5148\u53D6\u51ED\u636E\u518D\u4E0B\u8F7D\uFF09"
  });
}
