package ours_product_loss

import (
	"ai_scheduler/internal/config"
	"ai_scheduler/internal/pkg/l_request"
	"context"
	"encoding/json"
	"fmt"
	"strings"
)

type Client struct {
	cfg config.ToolConfig
}

func New(cfg config.ToolConfig) *Client {
	return &Client{
		cfg: cfg,
	}
}

// Call 调用负利润分析接口
// 支持列表查询和详情查询
// 列表查询：提供 page, limit, ct[]
// 详情查询：提供 ct[], resellerId
func (c *Client) Call(ctx context.Context, req OursProductLossRequest) (*OursProductLossData, error) {
	// 处理数组参数 ct[]
	// util.StructToMap 通常不支持数组到 url query array 的转换，这里手动处理查询字符串
	// 或者如果 l_request 支持 map 中的 slice 自动转换最好，假设不支持需手动拼接

	// 构建 URL 参数
	var queryParams []string

	if req.Page > 0 {
		queryParams = append(queryParams, fmt.Sprintf("page=%d", req.Page))
	}
	if req.Limit > 0 {
		queryParams = append(queryParams, fmt.Sprintf("limit=%d", req.Limit))
	}
	if req.ResellerId != "" {
		queryParams = append(queryParams, fmt.Sprintf("resellerId=%s", req.ResellerId))
	}

	for _, t := range req.Ct {
		// URL 编码处理，这里简单处理，实际应使用 url.QueryEscape
		// 假设输入已经是合法的格式
		queryParams = append(queryParams, fmt.Sprintf("ct[]=%s", strings.ReplaceAll(t, " ", "+")))
	}

	queryString := strings.Join(queryParams, "&")
	fullURL := fmt.Sprintf("%s?%s", c.cfg.BaseURL, queryString)

	headers := map[string]string{
		"Authorization": fmt.Sprintf("Bearer %s", c.cfg.APIKey),
	}

	reqObj := l_request.Request{
		Method:  "GET",
		Url:     fullURL,
		Headers: headers,
	}

	res, err := reqObj.Send()
	if err != nil {
		return nil, fmt.Errorf("请求失败，err: %v", err)
	}

	var resData OursProductLossResponse
	if err := json.Unmarshal([]byte(res.Text), &resData); err != nil {
		return nil, fmt.Errorf("解析响应失败，err: %v, resp: %s", err, res.Text)
	}

	if resData.Code != 200 {
		return nil, fmt.Errorf("业务错误，code: %d, msg: %s", resData.Code, resData.Msg)
	}

	return &resData.Data, nil
}
