package com.qqchen.deploy.backend.workflow.dto.inputmapping;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import org.springframework.http.HttpMethod;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * HTTP请求节点输入映射
 *
 * @author qqchen
 * @since 2025-11-20
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class HttpRequestInputMapping extends BaseNodeInputMapping {

    /**
     * 请求URL（支持表达式）
     */
    @NotBlank(message = "请求URL不能为空")
    private String url;

    /**
     * HTTP方法
     */
    private HttpMethod method = HttpMethod.GET;

    /**
     * 请求头（数组格式，前端 KeyValueEditor 传入）
     */
    private List<KeyValue> headers;

    /**
     * 请求体（自动序列化为JSON）
     */
    private Object body;

    /**
     * 查询参数（数组格式，前端 KeyValueEditor 传入）
     */
    private List<KeyValue> queryParams;

    /**
     * 超时时间（毫秒），默认30秒
     */
    private Integer timeout = 30000;

    /**
     * 响应体解析类型
     */
    private ResponseBodyType responseBodyType = ResponseBodyType.JSON;

    /**
     * 是否跟随重定向
     */
    private Boolean followRedirects = true;

    /**
     * SSL证书验证（生产环境建议true）
     */
    private Boolean verifySsl = true;

    /**
     * 键值对内部类（用于前端 KeyValueEditor 组件）
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class KeyValue {
        private String key;
        private String value;
    }

    /**
     * 将请求头数组转换为Map（供HTTP客户端使用）
     */
    public Map<String, String> getHeadersAsMap() {
        if (headers == null || headers.isEmpty()) {
            return Collections.emptyMap();
        }
        return headers.stream()
            .filter(kv -> kv.getKey() != null && !kv.getKey().isEmpty())
            .collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue));
    }

    /**
     * 将查询参数数组转换为Map（供URL构建使用）
     */
    public Map<String, String> getQueryParamsAsMap() {
        if (queryParams == null || queryParams.isEmpty()) {
            return Collections.emptyMap();
        }
        return queryParams.stream()
            .filter(kv -> kv.getKey() != null && !kv.getKey().isEmpty())
            .collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue));
    }

    /**
     * 响应体解析类型枚举
     */
    public enum ResponseBodyType {
        /** JSON格式（自动解析为Map/List） */
        JSON,
        /** 纯文本 */
        TEXT,
        /** XML格式 */
        XML,
        /** 二进制数据 */
        BINARY
    }
}
