package schedule

import "fmt"

// ==================== 参数解析辅助 ====================
// 这些函数专门用于从 LLM 输出的 map[string]any 中提取工具参数。
// JSON 反序列化后数字默认为 float64，字符串为 string，需要类型断言。

// argsInt 从 map 中提取 int 值。支持 float64（JSON 反序列化的默认类型）。
func ArgsInt(args map[string]any, key string) (int, bool) {
	v, ok := args[key]
	if !ok {
		return 0, false
	}
	switch n := v.(type) {
	case float64:
		return int(n), true
	case int:
		return n, true
	}
	return 0, false
}

// argsString 从 map 中提取 string 值。
func ArgsString(args map[string]any, key string) (string, bool) {
	v, ok := args[key]
	if !ok {
		return "", false
	}
	s, ok := v.(string)
	return s, ok
}

// argsIntPtr 从 map 中提取可选 int 值，不存在返回 nil。
func ArgsIntPtr(args map[string]any, key string) *int {
	v, ok := ArgsInt(args, key)
	if !ok {
		return nil
	}
	return &v
}

// argsStringPtr 从 map 中提取可选 string 值，不存在返回 nil。
func ArgsStringPtr(args map[string]any, key string) *string {
	v, ok := ArgsString(args, key)
	if !ok {
		return nil
	}
	return &v
}

// argsIntSlice 从 map 中提取 int 数组，支持 []any / []int / []float64。
func ArgsIntSlice(args map[string]any, key string) ([]int, bool) {
	v, ok := args[key]
	if !ok {
		return nil, false
	}
	switch arr := v.(type) {
	case []int:
		if len(arr) == 0 {
			return []int{}, true
		}
		result := make([]int, len(arr))
		copy(result, arr)
		return result, true
	case []float64:
		result := make([]int, 0, len(arr))
		for _, item := range arr {
			result = append(result, int(item))
		}
		return result, true
	case []any:
		result := make([]int, 0, len(arr))
		for _, item := range arr {
			switch n := item.(type) {
			case float64:
				result = append(result, int(n))
			case int:
				result = append(result, n)
			default:
				return nil, false
			}
		}
		return result, true
	default:
		return nil, false
	}
}

// argsMoveList 从 map 中提取 batch_move 的 moves 数组。
func ArgsMoveList(args map[string]any) ([]MoveRequest, error) {
	v, ok := args["moves"]
	if !ok {
		return nil, fmt.Errorf("缺少 moves 参数")
	}
	arr, ok := v.([]any)
	if !ok {
		return nil, fmt.Errorf("moves 参数必须是数组")
	}
	moves := make([]MoveRequest, 0, len(arr))
	for i, item := range arr {
		m, ok := item.(map[string]any)
		if !ok {
			return nil, fmt.Errorf("moves[%d] 不是有效对象", i)
		}
		taskID, ok := ArgsInt(m, "task_id")
		if !ok {
			return nil, fmt.Errorf("moves[%d].task_id 缺失或无效", i)
		}
		newDay, ok := ArgsInt(m, "new_day")
		if !ok {
			return nil, fmt.Errorf("moves[%d].new_day 缺失或无效", i)
		}
		newSlotStart, ok := ArgsInt(m, "new_slot_start")
		if !ok {
			return nil, fmt.Errorf("moves[%d].new_slot_start 缺失或无效", i)
		}
		moves = append(moves, MoveRequest{
			TaskID:       taskID,
			NewDay:       newDay,
			NewSlotStart: newSlotStart,
		})
	}
	return moves, nil
}
