///|
/// convert_* 组合入口 — 中转站(场景 2)
///
/// 协议 A JSON/SSE → Lux IR → 协议 B JSON/SSE。
/// 实现 = source 解码 + target 编码,零新增转换逻辑,复用 ProviderRegistration 注册表。

///|
/// ConvertMetaResult — convert 结果:目标协议 JSON + 来源元信息(D8)
pub struct ConvertMetaResult {
  value : String
  meta : ConversionMeta
}

///|
pub fn ConvertMetaResult::new(
  value : String,
  meta : ConversionMeta,
) -> ConvertMetaResult {
  { value, meta }
}

///|
pub fn ConvertMetaResult::value(self : ConvertMetaResult) -> String {
  self.value
}

///|
pub fn ConvertMetaResult::meta(self : ConvertMetaResult) -> ConversionMeta {
  self.meta
}

///|
/// 响应转换(带来源元信息):source 协议 JSON → target 协议 JSON。
/// meta.source_provider 为注册表解析的规范 source 名(别名/模型正则归一)。
pub fn convert_response_with_meta(
  source : String,
  json_str : String,
  target : String,
) -> Result[ConvertMetaResult, String] {
  match match_provider_name(source) {
    Some(src) =>
      match match_provider_name(target) {
        Some(dst) =>
          match (src.response_decode)(json_str) {
            Ok(dcr) =>
              match (dst.response_encode)(dcr.value()) {
                Ok(ecr) => {
                  let merged = merge_diagnostics(ecr, dcr.diagnostics())
                  let meta = ConversionMeta::new(
                    src.name,
                    merged.diagnostics(),
                    dcr.value().provider_payload,
                    None,
                  )
                  Ok(ConvertMetaResult::new(merged.value(), meta))
                }
                Err(e) => Err(e)
              }
            Err(e) => Err(e)
          }
        None => Err("unknown provider: " + target)
      }
    None => Err("unknown provider: " + source)
  }
}

///|
/// 请求:source 协议 JSON → target 协议 JSON(带诊断)
pub fn convert_request(
  source : String,
  json_str : String,
  target : String,
) -> Result[@lux.ConversionResult[String], String] {
  match match_provider_name(source) {
    Some(src) =>
      match match_provider_name(target) {
        Some(dst) =>
          decode_encode_request(
            json_str,
            src.request_decode,
            dst.request_encode,
          )
        None => Err("unknown provider: " + target)
      }
    None => Err("unknown provider: " + source)
  }
}

///|
/// 响应:source 协议 JSON → target 协议 JSON(带诊断)
pub fn convert_response(
  source : String,
  json_str : String,
  target : String,
) -> Result[@lux.ConversionResult[String], String] {
  match match_provider_name(source) {
    Some(src) =>
      match match_provider_name(target) {
        Some(dst) =>
          decode_encode_response(
            json_str,
            src.response_decode,
            dst.response_encode,
          )
        None => Err("unknown provider: " + target)
      }
    None => Err("unknown provider: " + source)
  }
}

///|
/// 流式:source 协议 SSE → target 协议 SSE(事件级转换,带诊断)
pub fn convert_stream(
  source : String,
  sse_str : String,
  target : String,
) -> Result[@lux.ConversionResult[String], String] {
  match match_provider_name(source) {
    Some(src) =>
      match match_provider_name(target) {
        Some(dst) =>
          decode_encode_stream(sse_str, src.events_decode, dst.events_encode)
        None => Err("unknown provider: " + target)
      }
    None => Err("unknown provider: " + source)
  }
}

///|
/// 通用:source 解码 → target 编码(合并解码+编码诊断,返回带诊断结果)
fn decode_encode_request(
  json_str : String,
  decode : (String) -> Result[@lux.ConversionResult[@lux.LucentRequest], String],
  encode : (@lux.LucentRequest) -> Result[@lux.ConversionResult[String], String],
) -> Result[@lux.ConversionResult[String], String] {
  match decode(json_str) {
    Ok(dcr) =>
      match encode(dcr.value()) {
        Ok(ecr) => Ok(merge_diagnostics(ecr, dcr.diagnostics()))
        Err(e) => Err(e)
      }
    Err(e) => Err(e)
  }
}

///|
/// 通用:source 解码 → target 编码(合并诊断)
fn decode_encode_response(
  json_str : String,
  decode : (String) -> Result[
    @lux.ConversionResult[@lux.LucentResponse],
    String,
  ],
  encode : (@lux.LucentResponse) -> Result[
    @lux.ConversionResult[String],
    String,
  ],
) -> Result[@lux.ConversionResult[String], String] {
  match decode(json_str) {
    Ok(dcr) =>
      match encode(dcr.value()) {
        Ok(ecr) => Ok(merge_diagnostics(ecr, dcr.diagnostics()))
        Err(e) => Err(e)
      }
    Err(e) => Err(e)
  }
}

///|
/// 通用:source 事件解码 → target 事件编码(合并诊断)
fn decode_encode_stream(
  sse_str : String,
  decode : (String) -> Result[
    @lux.ConversionResult[Array[@lux.LucentStreamEvent]],
    String,
  ],
  encode : (Array[@lux.LucentStreamEvent]) -> Result[
    @lux.ConversionResult[String],
    String,
  ],
) -> Result[@lux.ConversionResult[String], String] {
  match decode(sse_str) {
    Ok(dcr) =>
      match encode(dcr.value()) {
        Ok(ecr) => Ok(merge_diagnostics(ecr, dcr.diagnostics()))
        Err(e) => Err(e)
      }
    Err(e) => Err(e)
  }
}

///|
/// 合并两组诊断:以编码结果为主体,把解码诊断并入
fn merge_diagnostics(
  main : @lux.ConversionResult[String],
  other_diags : Array[@lux.ConversionDiagnostic],
) -> @lux.ConversionResult[String] {
  let mut merged = main
  for d in other_diags {
    merged = merged.with_diagnostic(d)
  }
  merged
}