package exec

import invopopjsonschema "github.com/invopop/jsonschema"

func (taskCreateRequest) JSONSchema() *invopopjsonschema.Schema {
	titleOnlyTask := closedWorkflowObject(
		map[string]any{"title": taskNonBlankStringSchema(512)},
		"title",
	)
	richTask := closedWorkflowObject(
		map[string]any{
			"title":       taskNonBlankStringSchema(512),
			"description": taskStringSchema(8192),
			"kind":        taskStringSchema(512),
			"priority":    taskStringSchema(512),
			"assignee":    taskStringSchema(512),
		},
		"title",
	)
	richTask["anyOf"] = []any{
		map[string]any{"required": []string{"description"}},
		map[string]any{"required": []string{"kind"}},
		map[string]any{"required": []string{"priority"}},
		map[string]any{"required": []string{"assignee"}},
	}
	parentTaskScope := closedWorkflowObject(
		map[string]any{
			"kind":    map[string]any{"type": "string", "const": "task"},
			"scopeId": map[string]any{"type": "string", "pattern": workflowScopeIDPattern},
		},
		"kind", "scopeId",
	)
	schema := closedWorkflowObject(
		map[string]any{
			"channel": map[string]any{"type": "string", "minLength": 1},
			"tasks": map[string]any{
				"type": "array", "minItems": 1, "maxItems": 20,
				"oneOf": []any{
					map[string]any{
						"items": titleOnlyTask,
					},
					map[string]any{
						"minItems": 1,
						"maxItems": 1,
						"items":    richTask,
					},
				},
			},
			"parent":          map[string]any{"type": "integer", "minimum": 1},
			"parentTaskScope": parentTaskScope,
			"target":          map[string]any{"type": "string"},
		},
		"tasks",
	)
	schema["oneOf"] = []any{
		map[string]any{
			"required": []string{"tasks"},
			"not":      map[string]any{"required": []string{"parentTaskScope"}},
		},
		map[string]any{
			"required": []string{"parentTaskScope"},
			"not": map[string]any{"anyOf": []any{
				map[string]any{"required": []string{"channel"}},
				map[string]any{"required": []string{"parent"}},
			}},
		},
	}
	return mustTypedWorkflowSchema(mustWorkflowSchema(schema))
}
