package zltx

import (
	"ai_scheduler/internal/config"
	"ai_scheduler/internal/entitys"
	"ai_scheduler/internal/pkg/rec_extra"
	"context"
	"encoding/json"
	"fmt"
	"strconv"
	"strings"

	"gitea.cdlsxd.cn/self-tools/l_request"
)

type ZltxProductTool struct {
	config config.ToolConfig
}

func (z ZltxProductTool) Name() string {
	return "zltxProduct"
}

func (z ZltxProductTool) Description() string {
	return "获取直连天下商品信息"
}

func (z ZltxProductTool) Definition(ctx context.Context) entitys.ToolDefinition {
	return entitys.ToolDefinition{
		Type: "function",
		Function: entitys.FunctionDef{
			Name:        z.Name(),
			Description: z.Description(),
			Parameters: map[string]interface{}{
				"type": "object",
				"properties": map[string]interface{}{
					"id": map[string]interface{}{
						"type":        "string",
						"description": "商品ID",
					},
					"name": map[string]interface{}{
						"type":        "string",
						"description": "商品名称",
					},
				},
				"required": []string{"id", "name"},
			},
		},
	}
}

type ZltxProductRequest struct {
	Id   string `json:"id"`
	Name string `json:"name"`
}

func (z ZltxProductTool) Execute(ctx context.Context, rec *entitys.Recognize) error {
	var req ZltxProductRequest
	if err := json.Unmarshal([]byte(rec.Match.Parameters), &req); err != nil {
		return fmt.Errorf("invalid zltxProduct request: %w", err)
	}
	return z.getZltxProduct(&req, rec)
}

type ZltxProductResponse struct {
	Code int `json:"code"`
	Data struct {
		DataCount int               `json:"dataCount"`
		List      []ZltxProductData `json:"list"`
	} `json:"data"`
	Error string `json:"error"`
}

type ZltxProductDataById struct {
	Code  int             `json:"code"`
	Data  ZltxProductData `json:"data"`
	Error string          `json:"error"`
}

type ZltxProductData struct {
	ID                    int    `json:"id"`
	OursProductCategoryID int    `json:"ours_product_category_id"`
	OfficialProductID     int    `json:"official_product_id"`
	Tag                   string `json:"tag"`
	Name                  string `json:"name"`
	Type                  int    `json:"type"`
	Discount              string `json:"discount"`
	Preview               string `json:"preview"`
	Describe              string `json:"describe"`
	Price                 string `json:"price"`
	Status                int    `json:"status"`
	CreateTime            string `json:"create_time"`
	UpdateTime            string `json:"update_time"`
	Extend                string `json:"extend"`
	Wight                 int    `json:"wight"`
	Property              int    `json:"property"`
	AuthProductInfo       []any  `json:"auth_product_info"`
	AuthProductIds        string `json:"auth_product_ids"`
	Category              struct {
		ID         int    `json:"id"`
		Name       string `json:"name"`
		Status     int    `json:"status"`
		CreateTime string `json:"create_time"`
		Pid        int    `json:"pid"`
	} `json:"category"`
	OfficialProduct struct {
		ID         int     `json:"id"`
		OfficialID int     `json:"official_id"`
		Name       string  `json:"name"`
		Describe   string  `json:"describe"`
		Preview    string  `json:"preview"`
		Price      float64 `json:"price"`
		Status     int     `json:"status"`
		CreateTime string  `json:"create_time"`
		UpdateTime string  `json:"update_time"`
		Type       int     `json:"type"`
		Daies      int     `json:"daies"`
		PreviewURL string  `json:"preview_url"`
		Official   struct {
			ID          int    `json:"id"`
			Name        string `json:"name"`
			Describe    string `json:"describe"`
			Num         int    `json:"num"`
			Status      int    `json:"status"`
			WebURL      string `json:"web_url"`
			RechargeURL string `json:"recharge_url"`
			CreateTime  string `json:"create_time"`
			UpdateTime  string `json:"update_time"`
			Type        int    `json:"type"`
			Tag         string `json:"tag"`
		} `json:"official"`
	} `json:"official_product"`
	Statistics          interface{} `json:"statistics"`
	PlatformProductList interface{} `json:"platform_product_list"`
}

func (z ZltxProductTool) getZltxProduct(body *ZltxProductRequest, rec *entitys.Recognize) error {
	ext, err := rec_extra.GetTaskRecExt(rec)
	if err != nil {
		return err
	}
	var Url string
	var params map[string]string
	if body.Id != "" {
		Url = fmt.Sprintf("%s/%s", z.config.BaseURL, body.Id)
	} else {
		Url = fmt.Sprintf("%s?keyword=%s&limit=10&page=1", z.config.BaseURL, body.Name)
		params = map[string]string{
			"keyword": body.Name,
			"limit":   "10",
			"page":    "1",
		}
	}
	req := l_request.Request{
		//get /admin/oursProduct/{product_id} 通过商品id获取我们的商品信息
		//get /admin/oursProduct?keyword={name}&limit=10&page=1 通过商品name获取我们的商品列表
		//根据商品ID或名称走不同的接口查询
		Url: Url,
		Headers: map[string]string{
			"Authorization": fmt.Sprintf("Bearer %s", ext.Auth),
		},
		Params: params,
		Method: "GET",
	}
	res, err := req.Send()
	if err != nil {
		return err
	}
	var resp ZltxProductResponse
	if err = json.Unmarshal(res.Content, &resp); err != nil {
		return fmt.Errorf("解析商品数据失败：%w", err)
	}
	if resp.Code != 200 {
		return fmt.Errorf("商品查询失败：%s", string(res.Content))
	}
	if resp.Data.List == nil || len(resp.Data.List) == 0 {
		var respData ZltxProductDataById
		if err := json.Unmarshal(res.Content, &respData); err != nil {
			return fmt.Errorf("解析商品数据失败：%w", err)
		}
		if respData.Data.ID == 0 {
			return fmt.Errorf("商品查询失败：暂无数据")
		}
		resp.Data.List = []ZltxProductData{respData.Data}
		resp.Data.DataCount = 1
	}
	//调用 平台商品列表
	if resp.Data.List != nil && len(resp.Data.List) > 0 {
		for i := range resp.Data.List {
			// 调用 平台商品列表
			if resp.Data.List[i].AuthProductIds != "" {
				platformProductList := z.ExecutePlatformProductList(ext.Auth, resp.Data.List[i].AuthProductIds, resp.Data.List[i].OfficialProductID)
				resp.Data.List[i].PlatformProductList = platformProductList
			}
		}
	}
	marshal, err := json.Marshal(resp)
	if err != nil {
		return err
	}
	entitys.ResJson(rec.Ch, z.Name(), string(marshal))

	return nil
}

type PlatformProductResponse struct {
	Code int `json:"code"`
	Data []struct {
		ID                int      `json:"id"`
		PlatformID        int      `json:"platform_id"`
		OfficialProductID int      `json:"official_product_id"`
		Weight            int      `json:"weight"`
		Code              string   `json:"code"`
		Name              string   `json:"name"`
		Discount          string   `json:"discount"`
		Price             string   `json:"price"`
		Extra             string   `json:"extra"`
		AccountType       []string `json:"account_type"`
		Status            int      `json:"status"`
		CreateTime        string   `json:"create_time"`
		UpdateTime        string   `json:"update_time"`
		RebatePrice       string   `json:"rebate_price"`
		ExchangeType      int      `json:"exchange_type"`
		IsReportInfo      int      `json:"is_report_info"`
		Describe          string   `json:"describe"`
		PlatformAliasID   int      `json:"platform_alias_id"`
		Platform          struct {
			ID                  int    `json:"id"`
			Tag                 string `json:"tag"`
			Name                string `json:"name"`
			Status              int    `json:"status"`
			Weight              int    `json:"weight"`
			UpdateTime          string `json:"update_time"`
			SearchTime          string `json:"search_time"`
			Balance             string `json:"balance"`
			BalanceWarning      string `json:"balance_warning"`
			StockType           int    `json:"stock_type"`
			IsIndependent       int    `json:"is_independent"`
			IndependentDeadline string `json:"independent_deadline"`
			CreateTime          string `json:"create_time"`
		} `json:"platform"`
	} `json:"data"`
	Error string `json:"error"`
}

type PlatformData struct {
	ID                int      `json:"id"`
	PlatformID        int      `json:"platform_id"`
	OfficialProductID int      `json:"official_product_id"`
	Weight            int      `json:"weight"`
	Code              string   `json:"code"`
	Name              string   `json:"name"`
	Discount          string   `json:"discount"`
	Price             string   `json:"price"`
	Extra             string   `json:"extra"`
	AccountType       []string `json:"account_type"`
	Status            int      `json:"status"`
	CreateTime        string   `json:"create_time"`
	UpdateTime        string   `json:"update_time"`
	RebatePrice       string   `json:"rebate_price"`
	ExchangeType      int      `json:"exchange_type"`
	IsReportInfo      int      `json:"is_report_info"`
	Describe          string   `json:"describe"`
	PlatformAliasID   int      `json:"platform_alias_id"`
	Platform          struct {
		ID                  int    `json:"id"`
		Tag                 string `json:"tag"`
		Name                string `json:"name"`
		Status              int    `json:"status"`
		Weight              int    `json:"weight"`
		UpdateTime          string `json:"update_time"`
		SearchTime          string `json:"search_time"`
		Balance             string `json:"balance"`
		BalanceWarning      string `json:"balance_warning"`
		StockType           int    `json:"stock_type"`
		IsIndependent       int    `json:"is_independent"`
		IndependentDeadline string `json:"independent_deadline"`
		CreateTime          string `json:"create_time"`
	} `json:"platform"`
}

func (z ZltxProductTool) ExecutePlatformProductList(auth string, authProductIds string, officialProductID int) []PlatformData {
	if authProductIds == "" {
		return nil
	}
	//authProductIds 以逗号分割
	authProductIdList := strings.Split(authProductIds, ",")

	for _, authProductId := range authProductIdList {
		var platformProductResponse PlatformProductResponse
		req := l_request.Request{
			//https://gateway.dev.cdlsxd.cn/zltx_api/admin/platformProduct/getProductsByOfficialProductId?official_product_id=282&is_all=true
			Url: fmt.Sprintf("%s?official_product_id=%d&is_all=true", z.config.AddURL, officialProductID),
			Headers: map[string]string{
				"Authorization": fmt.Sprintf("Bearer %s", auth),
			},
			Method: "GET",
		}

		res, err := req.Send()
		if err != nil {
			// 可以考虑记录日志而不是直接跳过
			continue
		}

		if err := json.Unmarshal(res.Content, &platformProductResponse); err != nil {
			// 可以考虑记录日志而不是直接跳过
			continue
		}
		authProductIdInt, err := strconv.Atoi(authProductId)
		if err != nil {
			// 可以考虑记录日志而不是直接跳过
			continue
		}
		for _, platformProduct := range platformProductResponse.Data {
			if platformProduct.ID == authProductIdInt {
				return []PlatformData{platformProduct}
			}
		}
	}

	return nil
}

type ZltxProductPlatformProductList struct {
	Code  int            `json:"code"`
	Data  map[string]any `json:"data"`
	Error string         `json:"error"`
}

func NewZltxProductTool(config config.ToolConfig) *ZltxProductTool {
	return &ZltxProductTool{
		config: config,
	}
}
