package taskboard

import (
	"context"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

func (txs TxStore) ensureWorkspaceTaskFieldCatalog(ctx context.Context, execer coredb.QueryExecer, workspaceID string) (taskFieldCatalog, error) {
	if err := EnsureDefaultTaskFieldOptions(ctx, execer, workspaceID); err != nil {
		return taskFieldCatalog{}, err
	}
	return loadTaskFieldCatalog(ctx, execer, workspaceID)
}

func (txs TxStore) normalizeTasksWithTaxonomy(ctx context.Context, execer coredb.QueryExecer, workspaceID string, tasks []Task) ([]Task, error) {
	if len(tasks) == 0 {
		return tasks, nil
	}
	if !tasksNeedTaskFieldCatalog(tasks) {
		for index := range tasks {
			normalizeTaskWithTaxonomy(&tasks[index], taskFieldCatalog{})
		}
		return tasks, nil
	}
	catalog, err := loadTaskFieldCatalog(ctx, execer, workspaceID)
	if err != nil {
		return nil, err
	}
	for index := range tasks {
		normalizeTaskWithTaxonomy(&tasks[index], catalog)
	}
	return tasks, nil
}

func tasksNeedTaskFieldCatalog(tasks []Task) bool {
	for index := range tasks {
		if taskFieldValueNeedsCatalog(tasks[index].KindField) || taskFieldValueNeedsCatalog(tasks[index].PriorityField) {
			return true
		}
	}
	return false
}

func taskFieldValueNeedsCatalog(field *TaskFieldValue) bool {
	return field != nil && field.IsLegacy && !field.IsNone
}

func normalizeTaskWithTaxonomy(task *Task, catalog taskFieldCatalog) {
	if task == nil {
		return
	}
	task.KindField = normalizeTaskFieldValue(task.KindField, taskFieldKindKind, catalog)
	task.PriorityField = normalizeTaskFieldValue(task.PriorityField, taskFieldKindPriority, catalog)
	task.Kind = taskFieldDisplay(task.KindField)
	task.Priority = taskFieldDisplay(task.PriorityField)
}

func normalizeTaskFieldValue(field *TaskFieldValue, fieldKind string, catalog taskFieldCatalog) *TaskFieldValue {
	if field == nil || field.IsNone || !field.IsLegacy {
		return field
	}
	option, ok := catalog.resolveAny(fieldKind, field.RawValue)
	if !ok {
		return field
	}
	return &TaskFieldValue{
		OptionID: option.ID,
		Key:      option.Key,
		Label:    option.Label,
	}
}
