package dto

import (
	"bytes"
	"encoding/json"
	"errors"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/service/kb"
)

// KnowledgeBase is the frontend-facing MeshX KB response.
type KnowledgeBase struct {
	ID                                  string                     `json:"id"`
	WorkspaceID                         string                     `json:"workspaceId"`
	GroupID                             string                     `json:"groupId"`
	Group                               *KnowledgeBaseGroup        `json:"group,omitempty"`
	Tags                                []KnowledgeBaseTag         `json:"tags"`
	SourceCount                         int64                      `json:"sourceCount"`
	Name                                string                     `json:"name"`
	Description                         string                     `json:"description,omitempty"`
	StorageScope                        string                     `json:"storageScope"`
	StorageOwnerLogin                   string                     `json:"storageOwnerLogin"`
	DefaultWorkspaceMemberRole          string                     `json:"defaultWorkspaceMemberRole"`
	DefaultRepositoryAccessProfile      string                     `json:"defaultRepositoryAccessProfile"`
	AllowKnowledgeQAWithoutSourceAccess bool                       `json:"allowKnowledgeQAWithoutSourceAccess"`
	PublicationState                    string                     `json:"publicationState"`
	WorkingRevision                     string                     `json:"workingRevision,omitempty"`
	PublishedRevision                   string                     `json:"publishedRevision,omitempty"`
	PublishedAt                         string                     `json:"publishedAt,omitempty"`
	SetupSummary                        *KnowledgeBaseSetupSummary `json:"setupSummary,omitempty"`
	Sources                             []KBSource                 `json:"sources,omitempty"`
	RetrievalPolicy                     map[string]any             `json:"retrievalPolicy,omitempty"`
	SourceCollectionState               map[string]any             `json:"sourceCollectionState,omitempty"`
	CreatedAt                           string                     `json:"createdAt"`
	UpdatedAt                           string                     `json:"updatedAt"`
	LastAccessedAt                      string                     `json:"lastAccessAt,omitempty"`
	IsActive                            bool                       `json:"isActive"`
	Pinned                              bool                       `json:"pinned"`
	PinnedAt                            string                     `json:"pinnedAt,omitempty"`
	Role                                string                     `json:"role,omitempty"`
	CanManage                           bool                       `json:"canManage"`
	CanEditOfficial                     bool                       `json:"canEditOfficial"`
	CanConvertToDraft                   bool                       `json:"canConvertToDraft"`
	RepositoryAccessProfile             string                     `json:"repositoryAccessProfile,omitempty"`
	RepositoryAccessStatus              string                     `json:"repositoryAccessStatus,omitempty"`
	CreatedBy                           string                     `json:"createdBy,omitempty"`
	UpdatedBy                           string                     `json:"updatedBy,omitempty"`
}

type KnowledgeBaseSetupSummary struct {
	Mode       string `json:"mode"`
	ActiveStep string `json:"activeStep"`
	Version    int64  `json:"version"`
}

type KnowledgeBaseSetupCreateRequest struct {
	Name             string   `json:"name,omitempty"`
	Description      string   `json:"description,omitempty"`
	StorageScope     string   `json:"storageScope,omitempty"`
	RepoNameOverride string   `json:"repoNameOverride,omitempty"`
	GroupID          string   `json:"groupId,omitempty"`
	TagIDs           []string `json:"tagIds,omitempty"`
}

func (r KnowledgeBaseSetupCreateRequest) Input() kb.KBMutation {
	var groupID *string
	if strings.TrimSpace(r.GroupID) != "" {
		groupID = &r.GroupID
	}
	return kb.KBMutation{
		Name: r.Name, Description: r.Description, StorageScope: r.StorageScope,
		RepoNameOverride: r.RepoNameOverride, GroupID: groupID, TagIDs: r.TagIDs, TagIDsSet: r.TagIDs != nil,
	}
}

type KnowledgeBaseSetupStepRequest struct {
	ActiveStep      string `json:"activeStep"`
	ExpectedVersion int64  `json:"expectedVersion"`
}

type KnowledgeBaseOfficialEditBasicRequest struct {
	Name            string   `json:"name"`
	Description     string   `json:"description,omitempty"`
	GroupID         string   `json:"groupId"`
	TagIDs          []string `json:"tagIds"`
	ExpectedVersion int64    `json:"expectedVersion"`
}

func (r KnowledgeBaseOfficialEditBasicRequest) Input() kb.KBOfficialEditBasicMutation {
	return kb.KBOfficialEditBasicMutation{
		Name: r.Name, Description: r.Description, GroupID: r.GroupID,
		TagIDs: r.TagIDs, ExpectedVersion: r.ExpectedVersion,
	}
}

type KnowledgeBaseOfficialEditSaveRequest struct {
	WorkingRevision   string `json:"workingRevision"`
	PublishedRevision string `json:"publishedRevision"`
	ContentDigest     string `json:"contentDigest"`
	ExpectedVersion   int64  `json:"expectedVersion"`
	ClientRequestID   string `json:"clientRequestId"`
}

func (r KnowledgeBaseOfficialEditSaveRequest) Input() kb.KBOfficialEditSaveMutation {
	return kb.KBOfficialEditSaveMutation{
		WorkingRevision: r.WorkingRevision, PublishedRevision: r.PublishedRevision,
		ContentDigest:   r.ContentDigest,
		ExpectedVersion: r.ExpectedVersion, ClientRequestID: r.ClientRequestID,
	}
}

type KnowledgeBaseSetupSourceArtifactRequest struct {
	State string `json:"state"`
}

type KnowledgeBaseWikiGenerationRequest struct {
	SourceRevision string `json:"sourceRevision"`
	Scope          string `json:"scope,omitempty"`
	Language       string `json:"language,omitempty"`
	Reason         string `json:"reason,omitempty"`
	IdempotencyKey string `json:"idempotencyKey"`
}

type KnowledgeBaseWikiGenerationDecisionRequest struct {
	ExpectedVersion  int64  `json:"expectedVersion"`
	ClientDecisionID string `json:"clientDecisionId"`
	Decision         string `json:"decision"`
	Reason           string `json:"reason,omitempty"`
}

type KnowledgeBaseWikiGenerationWithdrawRequest struct {
	ExpectedVersion int64  `json:"expectedVersion"`
	ClientRequestID string `json:"clientRequestId"`
}

type KnowledgeBasePublicationRequest struct {
	WorkingRevision string `json:"workingRevision"`
	IdempotencyKey  string `json:"idempotencyKey"`
}

type KnowledgeBasePublicationDecisionRequest struct {
	ExpectedVersion  int64  `json:"expectedVersion"`
	ClientDecisionID string `json:"clientDecisionId"`
	Decision         string `json:"decision"`
	Reason           string `json:"reason,omitempty"`
}

type KnowledgeBasePublicationWithdrawRequest struct {
	ExpectedVersion int64  `json:"expectedVersion"`
	ClientRequestID string `json:"clientRequestId"`
}

func (r KnowledgeBaseWikiGenerationRequest) Input() kb.KBWikiGenerationMutation {
	return kb.KBWikiGenerationMutation{
		SourceRevision: r.SourceRevision, Scope: r.Scope, Language: r.Language,
		Reason: r.Reason, IdempotencyKey: r.IdempotencyKey,
	}
}

type KnowledgeBaseSetupSession struct {
	ID                       string                       `json:"id"`
	KnowledgeBaseID          string                       `json:"knowledgeBaseId"`
	Mode                     string                       `json:"mode"`
	ActiveStep               string                       `json:"activeStep"`
	WorkingRevision          string                       `json:"workingRevision"`
	PublishedRevision        string                       `json:"publishedRevision,omitempty"`
	Version                  int64                        `json:"version"`
	BasicInfo                KBSetupBasicInfo             `json:"basicInfo"`
	OfficialChangeFields     []string                     `json:"officialChangeFields"`
	OfficialContentDigest    string                       `json:"officialContentDigest,omitempty"`
	StepSummary              map[string]string            `json:"stepSummary"`
	Sources                  []KBSetupSource              `json:"sources"`
	PublicationRequest       *KBSetupPublicationRequest   `json:"publicationRequest,omitempty"`
	PublicationApprovers     []KBSetupPublicationApprover `json:"publicationApprovers"`
	CanRequestPublication    bool                         `json:"canRequestPublication"`
	CanReviewPublication     bool                         `json:"canReviewPublication"`
	CanWithdrawPublication   bool                         `json:"canWithdrawPublication"`
	CanDirectWikiGeneration  bool                         `json:"canDirectWikiGeneration"`
	CanRequestWikiGeneration bool                         `json:"canRequestWikiGeneration"`
	CanDirectDashboardImport bool                         `json:"canDirectDashboardImport"`
	CanSaveOfficial          bool                         `json:"canSaveOfficial"`
	UpdatedAt                string                       `json:"updatedAt"`
	UpdatedBy                string                       `json:"updatedBy"`
	CompletedAt              string                       `json:"completedAt,omitempty"`
}

type KBSetupBasicInfo struct {
	Name        string   `json:"name"`
	Description string   `json:"description,omitempty"`
	GroupID     string   `json:"groupId"`
	TagIDs      []string `json:"tagIds"`
}

type KBSetupPublicationApprover struct {
	PrincipalID string `json:"principalId"`
	DisplayName string `json:"displayName"`
}

type KnowledgeBasePublicationReview struct {
	KnowledgeBaseID string                                 `json:"knowledgeBaseId"`
	Name            string                                 `json:"name"`
	Description     string                                 `json:"description,omitempty"`
	GroupID         string                                 `json:"groupId"`
	TagIDs          []string                               `json:"tagIds"`
	Sources         []KnowledgeBasePublicationReviewSource `json:"sources"`
	Request         KBSetupPublicationRequest              `json:"request"`
	Approvers       []KBSetupPublicationApprover           `json:"approvers"`
	CanDecide       bool                                   `json:"canDecide"`
}

type KnowledgeBasePublicationReviewSource struct {
	ID                   string `json:"id"`
	SourceType           string `json:"sourceType"`
	Name                 string `json:"name"`
	Description          string `json:"description,omitempty"`
	DefaultRef           string `json:"defaultRef,omitempty"`
	Status               string `json:"status"`
	SyncStatus           string `json:"syncStatus"`
	IndexStatus          string `json:"indexStatus"`
	RevisionID           string `json:"revisionId"`
	SourceCommitSHA      string `json:"sourceCommitSha"`
	WikiRevision         string `json:"wikiRevision,omitempty"`
	DashboardRevision    string `json:"dashboardRevision,omitempty"`
	WikiDisposition      string `json:"wikiDisposition"`
	DashboardDisposition string `json:"dashboardDisposition"`
}

type KBSetupPublicationRequest struct {
	ID                  string `json:"id"`
	WorkingRevision     string `json:"workingRevision"`
	RequesterID         string `json:"requesterId"`
	ApprovalID          string `json:"approvalId"`
	ApprovalVersion     int64  `json:"approvalVersion"`
	Status              string `json:"status"`
	SourceCount         int    `json:"sourceCount"`
	WikiReadyCount      int    `json:"wikiReadyCount"`
	DashboardReadyCount int    `json:"dashboardReadyCount"`
	SkippedCount        int    `json:"skippedCount"`
	DecisionReason      string `json:"decisionReason,omitempty"`
	Version             int64  `json:"version"`
	CreatedAt           string `json:"createdAt"`
	UpdatedAt           string `json:"updatedAt"`
	PublishedAt         string `json:"publishedAt,omitempty"`
}

type KBSetupSource struct {
	SourceID                  string                    `json:"sourceId"`
	SourceRevision            string                    `json:"sourceRevision,omitempty"`
	SourceCommitSHA           string                    `json:"sourceCommitSha,omitempty"`
	WikiState                 string                    `json:"wikiState"`
	WikiRequest               *KBSetupGenerationRequest `json:"wikiRequest,omitempty"`
	CanReviewWikiGeneration   bool                      `json:"canReviewWikiGeneration"`
	CanWithdrawWikiGeneration bool                      `json:"canWithdrawWikiGeneration"`
	DashboardState            string                    `json:"dashboardState"`
}

type KBSetupGenerationRequest struct {
	ID               string `json:"id"`
	SourceRevision   string `json:"sourceRevision"`
	Scope            string `json:"scope"`
	Language         string `json:"language"`
	Reason           string `json:"reason,omitempty"`
	RequesterID      string `json:"requesterId"`
	ApprovalID       string `json:"approvalId,omitempty"`
	ApprovalVersion  int64  `json:"approvalVersion,omitempty"`
	Status           string `json:"status"`
	JobID            string `json:"jobId,omitempty"`
	ArtifactRevision string `json:"artifactRevision,omitempty"`
	DecisionReason   string `json:"decisionReason,omitempty"`
	Version          int64  `json:"version"`
	CreatedAt        string `json:"createdAt"`
	UpdatedAt        string `json:"updatedAt"`
}

type KnowledgeBaseSetupCreateResponse struct {
	KnowledgeBase KnowledgeBase             `json:"knowledgeBase"`
	Setup         KnowledgeBaseSetupSession `json:"setup"`
}

type KnowledgeBaseGroup struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	Description string `json:"description,omitempty"`
	Color       string `json:"color"`
	SortOrder   int    `json:"sortOrder"`
	IsDefault   bool   `json:"isDefault"`
}

type KnowledgeBaseTag struct {
	ID        string `json:"id"`
	Name      string `json:"name"`
	Color     string `json:"color"`
	SortOrder int    `json:"sortOrder"`
}

type KnowledgeBaseTaxonomy struct {
	Groups []KnowledgeBaseGroup `json:"groups"`
	Tags   []KnowledgeBaseTag   `json:"tags"`
}

type KnowledgeBaseTaxonomyMutationRequest struct {
	Name        string `json:"name"`
	Description string `json:"description,omitempty"`
	Color       string `json:"color,omitempty"`
	SortOrder   *int   `json:"sortOrder,omitempty"`
}

func (r KnowledgeBaseTaxonomyMutationRequest) Input() kb.KnowledgeBaseTaxonomyMutation {
	return kb.KnowledgeBaseTaxonomyMutation{Name: r.Name, Description: r.Description, Color: r.Color, SortOrder: r.SortOrder}
}

type AgentAccessibleKnowledgeBase struct {
	ID              string `json:"id"`
	WorkspaceID     string `json:"workspaceId"`
	Name            string `json:"name"`
	Description     string `json:"description,omitempty"`
	AccessLevel     string `json:"accessLevel"`
	PermissionSetAt string `json:"permissionSetAt"`
	UpdatedAt       string `json:"updatedAt"`
}

type AgentKnowledgeBaseAccessBatchRequest struct {
	AgentIDs       []string `json:"agentIds"`
	TemplateLocale string   `json:"templateLocale,omitempty"`
}

type AgentKnowledgeBaseAccessBatchResponse struct {
	Agents           map[string][]AgentAccessibleKnowledgeBaseForSync `json:"agents"`
	SyncToken        string                                           `json:"syncToken,omitempty"`
	SyncTokenExpires string                                           `json:"syncTokenExpires,omitempty"`
}

type AgentAccessibleKnowledgeBaseForSync struct {
	ID              string                           `json:"id"`
	WorkspaceID     string                           `json:"workspaceId"`
	Name            string                           `json:"name"`
	Description     string                           `json:"description,omitempty"`
	AccessLevel     string                           `json:"accessLevel"`
	PermissionSetAt string                           `json:"permissionSetAt"`
	UpdatedAt       string                           `json:"updatedAt"`
	Sources         []AgentAccessibleKBSourceForSync `json:"sources,omitempty"`
}

type AgentAccessibleKBSourceForSync struct {
	ID           string                               `json:"id"`
	Name         string                               `json:"name"`
	Description  string                               `json:"description,omitempty"`
	SourceType   string                               `json:"sourceType"`
	DefaultRef   string                               `json:"defaultRef,omitempty"`
	Repositories []AgentAccessibleKBRepositoryForSync `json:"repositories,omitempty"`
}

type AgentAccessibleKBRepositoryForSync struct {
	RepoRole      string                 `json:"repoRole"`
	Repository    *ResourceRepositoryRef `json:"repository,omitempty"`
	Branch        string                 `json:"branch"`
	AccessProfile string                 `json:"accessProfile"`
	AccessStatus  string                 `json:"accessStatus"`
	Writable      bool                   `json:"writable,omitempty"`
}

type KnowledgeBaseListResponse struct {
	Items       []KnowledgeBase           `json:"items"`
	GroupCounts []KnowledgeBaseGroupCount `json:"groupCounts"`
	Page        int                       `json:"page"`
	PerPage     int                       `json:"perPage"`
	Total       int64                     `json:"total"`
	HasMore     bool                      `json:"hasMore"`
}

type KnowledgeBaseGroupCount struct {
	GroupID          string `json:"groupId"`
	PublicationState string `json:"publicationState"`
	Count            int64  `json:"count"`
}

type KnowledgeBasePin struct {
	WorkspaceID     string `json:"workspaceId"`
	PrincipalID     string `json:"principalId,omitempty"`
	KnowledgeBaseID string `json:"knowledgeBaseId"`
	CreatedAt       string `json:"createdAt"`
	UpdatedAt       string `json:"updatedAt"`
}

type KBPermissionGrant struct {
	ID                        string                         `json:"id"`
	WorkspaceID               string                         `json:"workspaceId"`
	KnowledgeBaseID           string                         `json:"knowledgeBaseId"`
	SubjectType               string                         `json:"subjectType"`
	SubjectID                 string                         `json:"subjectId"`
	Role                      string                         `json:"role"`
	RepositoryAccessProfile   string                         `json:"repositoryAccessProfile"`
	RepositoryAccessStatus    string                         `json:"repositoryAccessStatus"`
	RepositoryAccessLastError string                         `json:"repositoryAccessLastError,omitempty"`
	CreatedBy                 string                         `json:"createdBy"`
	UpdatedBy                 string                         `json:"updatedBy"`
	CreatedAt                 string                         `json:"createdAt"`
	UpdatedAt                 string                         `json:"updatedAt"`
	SourceRepositoryAccess    []KBPermissionRepositoryAccess `json:"sourceRepositoryAccess,omitempty"`
}

type KBPermissionRepositoryAccess struct {
	SourceID                         string `json:"sourceId"`
	SourceName                       string `json:"sourceName,omitempty"`
	RepoRole                         string `json:"repoRole"`
	RepoFullName                     string `json:"repoFullName,omitempty"`
	InheritedRepositoryAccessProfile string `json:"inheritedRepositoryAccessProfile"`
	OverrideRepositoryAccessProfile  string `json:"overrideRepositoryAccessProfile,omitempty"`
	EffectiveRepositoryAccessProfile string `json:"effectiveRepositoryAccessProfile"`
	RepositoryAccessStatus           string `json:"repositoryAccessStatus"`
	RepositoryAccessLastError        string `json:"repositoryAccessLastError,omitempty"`
}

type KBPermissionsResponse struct {
	MyRole    string              `json:"myRole"`
	CanManage bool                `json:"canManage"`
	Owner     *KBPermissionGrant  `json:"owner,omitempty"`
	Self      *KBPermissionGrant  `json:"self,omitempty"`
	Members   []KBPermissionGrant `json:"members"`
	Agents    []KBPermissionGrant `json:"agents"`
}

type KBPermissionGrantRequest struct {
	SubjectType             string                                  `json:"subjectType"`
	SubjectID               string                                  `json:"subjectId"`
	Role                    *string                                 `json:"role"`
	RepositoryAccessProfile *string                                 `json:"repositoryAccessProfile"`
	RepositoryOverrides     []KBPermissionRepositoryOverrideRequest `json:"repositoryOverrides,omitempty"`
}

type KBPermissionRepositoryOverrideRequest struct {
	SourceID                string  `json:"sourceId"`
	RepoRole                string  `json:"repoRole"`
	RepositoryAccessProfile *string `json:"repositoryAccessProfile"`
}

func (r KBPermissionGrantRequest) Input() kb.KBPermissionGrantMutation {
	role := ""
	if r.Role != nil {
		role = *r.Role
	}
	return kb.KBPermissionGrantMutation{SubjectType: r.SubjectType, SubjectID: r.SubjectID, Role: role, RoleSet: r.Role != nil, RepositoryAccessProfile: r.RepositoryAccessProfile, RepositoryOverrides: toKBPermissionRepositoryOverrideMutations(r.RepositoryOverrides)}
}

type KBPermissionRepositoryOverridesRequest struct {
	Items []KBPermissionRepositoryOverrideRequest `json:"items"`
}

func (r KBPermissionRepositoryOverridesRequest) Input() []kb.KBPermissionRepositoryOverrideMutation {
	return toKBPermissionRepositoryOverrideMutations(r.Items)
}

func toKBPermissionRepositoryOverrideMutations(items []KBPermissionRepositoryOverrideRequest) []kb.KBPermissionRepositoryOverrideMutation {
	out := make([]kb.KBPermissionRepositoryOverrideMutation, 0, len(items))
	for _, item := range items {
		out = append(out, kb.KBPermissionRepositoryOverrideMutation{SourceID: item.SourceID, RepoRole: item.RepoRole, RepositoryAccessProfile: item.RepositoryAccessProfile})
	}
	return out
}

type AgentKnowledgeBaseBulkAccessRequest struct {
	KBIDs          []string                              `json:"kbIds"`
	KnowledgeBases []AgentKnowledgeBaseAccessItemRequest `json:"knowledgeBases"`
}

type AgentKnowledgeBaseAccessItemRequest struct {
	KnowledgeBaseID string `json:"knowledgeBaseId"`
	AccessLevel     string `json:"accessLevel"`
}

func (r AgentKnowledgeBaseBulkAccessRequest) Input() kb.AgentKnowledgeBaseBulkAccessMutation {
	knowledgeBases := make([]kb.AgentKnowledgeBaseAccessMutation, 0, len(r.KnowledgeBases))
	for _, item := range r.KnowledgeBases {
		knowledgeBases = append(knowledgeBases, kb.AgentKnowledgeBaseAccessMutation{KnowledgeBaseID: item.KnowledgeBaseID, AccessLevel: item.AccessLevel})
	}
	return kb.AgentKnowledgeBaseBulkAccessMutation{KnowledgeBaseIDs: r.KBIDs, KnowledgeBases: knowledgeBases}
}

type AgentAccessibleKnowledgeBaseGrant struct {
	AgentID         string `json:"agentId"`
	KnowledgeBaseID string `json:"knowledgeBaseId"`
	AccessLevel     string `json:"accessLevel"`
}

type AgentKnowledgeBaseBulkAccessResponse struct {
	AgentID                 string   `json:"agentId"`
	KnowledgeBaseIDs        []string `json:"knowledgeBaseIds"`
	GrantedKnowledgeBaseIDs []string `json:"grantedKnowledgeBaseIds"`
	RevokedKnowledgeBaseIDs []string `json:"revokedKnowledgeBaseIds"`
}

type KBSource struct {
	ID                              string                  `json:"id"`
	KnowledgeBaseID                 string                  `json:"knowledgeBaseId"`
	SourceType                      string                  `json:"sourceType"`
	Status                          string                  `json:"status,omitempty"`
	Name                            string                  `json:"name"`
	Description                     string                  `json:"description,omitempty"`
	DefaultRef                      string                  `json:"defaultRef,omitempty"`
	IndexingMode                    string                  `json:"indexingMode,omitempty"`
	SyncStatus                      string                  `json:"syncStatus,omitempty"`
	IndexStatus                     string                  `json:"indexStatus,omitempty"`
	AnalysisStatus                  string                  `json:"analysisStatus,omitempty"`
	FreshnessStatus                 string                  `json:"freshnessStatus,omitempty"`
	Config                          string                  `json:"configJson,omitempty"`
	LastError                       string                  `json:"lastError,omitempty"`
	LastSyncAt                      string                  `json:"lastSyncAt,omitempty"`
	LastIndexAt                     string                  `json:"lastIndexAt,omitempty"`
	LastAnalysisAt                  string                  `json:"lastAnalysisAt,omitempty"`
	Mirror                          *KBSourceMirrorSummary  `json:"mirror,omitempty"`
	ImportProgress                  *KBSourceImportProgress `json:"importProgress,omitempty"`
	SourceRepositoryAccessProfile   string                  `json:"sourceRepositoryAccessProfile,omitempty"`
	SourceRepositoryAccessStatus    string                  `json:"sourceRepositoryAccessStatus,omitempty"`
	InsightsRepositoryAccessProfile string                  `json:"insightsRepositoryAccessProfile,omitempty"`
	InsightsRepositoryAccessStatus  string                  `json:"insightsRepositoryAccessStatus,omitempty"`
	CreatedAt                       string                  `json:"createdAt"`
	UpdatedAt                       string                  `json:"updatedAt"`
}

type KBSourceImportProgress struct {
	State          string                       `json:"state"`
	Severity       string                       `json:"severity,omitempty"`
	Phase          string                       `json:"phase,omitempty"`
	Stage          string                       `json:"stage,omitempty"`
	Message        string                       `json:"message,omitempty"`
	Percent        *int                         `json:"percent,omitempty"`
	CurrentJobID   string                       `json:"currentJobId,omitempty"`
	CurrentJobType string                       `json:"currentJobType,omitempty"`
	StartedAt      string                       `json:"startedAt,omitempty"`
	UpdatedAt      string                       `json:"updatedAt,omitempty"`
	FinishedAt     string                       `json:"finishedAt,omitempty"`
	LastError      string                       `json:"lastError,omitempty"`
	Steps          []KBSourceImportProgressStep `json:"steps,omitempty"`
}

type KBSourceImportProgressStep struct {
	ID         string `json:"id"`
	Phase      string `json:"phase,omitempty"`
	Stage      string `json:"stage,omitempty"`
	Status     string `json:"status"`
	Optional   bool   `json:"optional,omitempty"`
	Message    string `json:"message,omitempty"`
	Error      string `json:"error,omitempty"`
	StartedAt  string `json:"startedAt,omitempty"`
	UpdatedAt  string `json:"updatedAt,omitempty"`
	FinishedAt string `json:"finishedAt,omitempty"`
}

type KBSourceMirrorSummary struct {
	SourceID           string                           `json:"sourceId"`
	UpstreamType       string                           `json:"upstreamType"`
	RemoteURL          string                           `json:"remoteUrl"`
	Credential         *KBSourceMirrorCredentialSummary `json:"credential,omitempty"`
	DefaultRef         string                           `json:"defaultRef,omitempty"`
	IntervalSeconds    int                              `json:"intervalSeconds"`
	Enabled            bool                             `json:"enabled"`
	SyncStatus         string                           `json:"syncStatus"`
	LastSyncAt         string                           `json:"lastSyncAt,omitempty"`
	LastSuccessAt      string                           `json:"lastSuccessAt,omitempty"`
	NextSyncAt         string                           `json:"nextSyncAt,omitempty"`
	LastError          string                           `json:"lastError,omitempty"`
	LastMirroredCommit string                           `json:"lastMirroredCommit,omitempty"`
	CreatedAt          string                           `json:"createdAt"`
	UpdatedAt          string                           `json:"updatedAt"`
}

type KBSourceMirrorCredentialSummary struct {
	Kind              string `json:"kind"`
	DisplayName       string `json:"displayName,omitempty"`
	OwnerPrincipalID  string `json:"ownerPrincipalId,omitempty"`
	ProviderType      string `json:"providerType,omitempty"`
	ProviderBaseURL   string `json:"providerBaseUrl,omitempty"`
	Status            string `json:"status,omitempty"`
	LastUsedAt        string `json:"lastUsedAt,omitempty"`
	ExpiresAt         string `json:"expiresAt,omitempty"`
	LinkedSourceCount int64  `json:"linkedSourceCount"`
}

type KnowledgeBaseCreateRequest struct {
	Name                                string   `json:"name"`
	RepoNameOverride                    string   `json:"repoNameOverride,omitempty"`
	Description                         string   `json:"description"`
	StorageScope                        string   `json:"storageScope,omitempty"`
	GroupID                             string   `json:"groupId,omitempty"`
	TagIDs                              []string `json:"tagIds,omitempty"`
	DefaultWorkspaceMemberRole          *string  `json:"defaultWorkspaceMemberRole,omitempty"`
	DefaultRepositoryAccessProfile      *string  `json:"defaultRepositoryAccessProfile,omitempty"`
	AllowKnowledgeQAWithoutSourceAccess *bool    `json:"allowKnowledgeQAWithoutSourceAccess,omitempty"`
	IsActive                            *bool    `json:"isActive"`
}

func (r KnowledgeBaseCreateRequest) Input() kb.KBMutation {
	var groupID *string
	if r.GroupID != "" {
		groupID = &r.GroupID
	}
	return kb.KBMutation{Name: r.Name, RepoNameOverride: r.RepoNameOverride, Description: r.Description, StorageScope: r.StorageScope, GroupID: groupID, TagIDs: r.TagIDs, TagIDsSet: true, DefaultWorkspaceMemberRole: r.DefaultWorkspaceMemberRole, DefaultRepositoryAccessProfile: r.DefaultRepositoryAccessProfile, AllowKnowledgeQAWithoutSourceAccess: r.AllowKnowledgeQAWithoutSourceAccess, IsActive: r.IsActive}
}

type KnowledgeBaseUpdateRequest struct {
	Name                                string    `json:"name"`
	Description                         string    `json:"description"`
	GroupID                             *string   `json:"groupId,omitempty"`
	TagIDs                              *[]string `json:"tagIds,omitempty"`
	DefaultWorkspaceMemberRole          *string   `json:"defaultWorkspaceMemberRole,omitempty"`
	DefaultRepositoryAccessProfile      *string   `json:"defaultRepositoryAccessProfile,omitempty"`
	AllowKnowledgeQAWithoutSourceAccess *bool     `json:"allowKnowledgeQAWithoutSourceAccess,omitempty"`
	IsActive                            *bool     `json:"isActive"`
}

func (r KnowledgeBaseUpdateRequest) Input() kb.KBMutation {
	input := kb.KBMutation{Name: r.Name, Description: r.Description, GroupID: r.GroupID, DefaultWorkspaceMemberRole: r.DefaultWorkspaceMemberRole, DefaultRepositoryAccessProfile: r.DefaultRepositoryAccessProfile, AllowKnowledgeQAWithoutSourceAccess: r.AllowKnowledgeQAWithoutSourceAccess, IsActive: r.IsActive}
	if r.TagIDs != nil {
		input.TagIDs = *r.TagIDs
		input.TagIDsSet = true
	}
	return input
}

type KBSourceMutationRequest struct {
	SourceType   string     `json:"sourceType"`
	Name         string     `json:"name"`
	Description  string     `json:"description"`
	RepoMode     string     `json:"repoMode"`
	DefaultRef   string     `json:"defaultRef"`
	IndexingMode string     `json:"indexingMode"`
	SyncStatus   string     `json:"syncStatus"`
	IndexStatus  string     `json:"indexStatus"`
	Config       JSONString `json:"configJson"`
	Repo         struct {
		Name             string `json:"name"`
		RepoNameOverride string `json:"repoNameOverride,omitempty"`
		Description      string `json:"description"`
		DefaultBranch    string `json:"defaultBranch"`
	} `json:"repo"`
	Mirror KBSourceMirrorMutationRequest `json:"mirror"`
}

type JSONString string

func (v *JSONString) UnmarshalJSON(data []byte) error {
	trimmed := bytes.TrimSpace(data)
	if bytes.Equal(trimmed, []byte("null")) {
		*v = ""
		return nil
	}
	var text string
	if err := json.Unmarshal(trimmed, &text); err == nil {
		*v = JSONString(text)
		return nil
	}
	if len(trimmed) == 0 || (trimmed[0] != '{' && trimmed[0] != '[') {
		return errors.New("configJson must be a string, object, array, or null")
	}
	var compacted bytes.Buffer
	if err := json.Compact(&compacted, trimmed); err != nil {
		return err
	}
	*v = JSONString(compacted.String())
	return nil
}

type KBSourceMirrorMutationRequest struct {
	UpstreamType       string  `json:"upstreamType"`
	RemoteURL          string  `json:"remoteUrl"`
	CredentialRef      string  `json:"credentialRef"`
	AccessToken        string  `json:"accessToken"`
	DefaultRef         *string `json:"defaultRef"`
	ExpectedDefaultRef *string `json:"expectedDefaultRef"`
	IntervalSeconds    *int    `json:"intervalSeconds"`
	Enabled            *bool   `json:"enabled"`
}

func (r KBSourceMutationRequest) Input() kb.KBSourceMutation {
	return kb.KBSourceMutation{
		SourceType:   r.SourceType,
		Name:         r.Name,
		Description:  r.Description,
		RepoMode:     r.RepoMode,
		DefaultRef:   r.DefaultRef,
		IndexingMode: r.IndexingMode,
		SyncStatus:   r.SyncStatus,
		IndexStatus:  r.IndexStatus,
		Config:       string(r.Config),
		Repo: kb.KBSourceRepositoryCreateInput{
			Name:             r.Repo.Name,
			RepoNameOverride: r.Repo.RepoNameOverride,
			Description:      r.Repo.Description,
			DefaultBranch:    r.Repo.DefaultBranch,
		},
		Mirror: r.Mirror.Input(),
	}
}

func (r KBSourceMirrorMutationRequest) Input() kb.KBSourceMirrorMutation {
	input := kb.KBSourceMirrorMutation{
		UpstreamType:       r.UpstreamType,
		RemoteURL:          r.RemoteURL,
		CredentialRef:      r.CredentialRef,
		AccessToken:        r.AccessToken,
		DefaultRefSet:      r.DefaultRef != nil,
		ExpectedDefaultRef: r.ExpectedDefaultRef,
		IntervalSeconds:    r.IntervalSeconds,
		Enabled:            r.Enabled,
	}
	if r.DefaultRef != nil {
		input.DefaultRef = *r.DefaultRef
	}
	return input
}

type KBSourceMirrorSyncRequest struct {
	Ref string `json:"ref"`
}

type KBSourceMirrorSyncJob struct {
	ID                  string `json:"id"`
	WorkspaceID         string `json:"workspaceId"`
	KnowledgeBaseID     string `json:"knowledgeBaseId"`
	SourceID            string `json:"sourceId"`
	Status              string `json:"status"`
	Stage               string `json:"stage,omitempty"`
	FailedStage         string `json:"failedStage,omitempty"`
	Message             string `json:"message,omitempty"`
	Error               string `json:"error,omitempty"`
	ErrorCode           string `json:"errorCode,omitempty"`
	Retryable           *bool  `json:"retryable,omitempty"`
	Ref                 string `json:"ref,omitempty"`
	Trigger             string `json:"trigger,omitempty"`
	RequestedBy         string `json:"requestedBy,omitempty"`
	TraceID             string `json:"traceId,omitempty"`
	AttemptCount        int    `json:"attemptCount"`
	GitOperation        string `json:"gitOperation,omitempty"`
	GitAttempt          int    `json:"gitAttempt,omitempty"`
	GitMaxAttempts      int    `json:"gitMaxAttempts,omitempty"`
	QueueWaitMS         *int64 `json:"queueWaitMs,omitempty"`
	ExecutionDurationMS *int64 `json:"executionDurationMs,omitempty"`
	CreatedAt           string `json:"createdAt"`
	StartedAt           string `json:"startedAt,omitempty"`
	UpdatedAt           string `json:"updatedAt"`
	FinishedAt          string `json:"finishedAt,omitempty"`
}

type KBSourceMirrorSyncListResponse struct {
	Mirror KBSourceMirrorSummary   `json:"mirror"`
	Items  []KBSourceMirrorSyncJob `json:"items"`
}

type KBRetrievalContextRequest struct {
	AgentID   string   `json:"agentId"`
	KBIDs     []string `json:"kbIds"`
	SourceIDs []string `json:"sourceIds"`
}

func (r KBRetrievalContextRequest) Input(actingUserID ...string) kb.KBRetrievalContextRequest {
	return kb.KBRetrievalContextRequest{
		AgentID:          r.AgentID,
		ActingUserID:     firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs: r.KBIDs,
		SourceIDs:        r.SourceIDs,
	}
}

type KBRetrievalSearchRequest struct {
	AgentID    string   `json:"agentId"`
	KBIDs      []string `json:"kbIds"`
	SourceIDs  []string `json:"sourceIds"`
	Query      string   `json:"query"`
	SearchMode string   `json:"searchMode"`
	TitleOnly  bool     `json:"titleOnly"`
	SlugPrefix string   `json:"slugPrefix"`
	Limit      int      `json:"limit"`
	MaxResults int      `json:"max_results"`
	Offset     int      `json:"offset"`
}

func (r KBRetrievalSearchRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBSearchRequest {
	return kb.KBSearchRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		Query:               r.Query,
		SearchMode:          r.SearchMode,
		TitleOnly:           r.TitleOnly,
		SlugPrefix:          r.SlugPrefix,
		Limit:               firstPositiveInt(r.MaxResults, r.Limit),
		Offset:              r.Offset,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBRetrievalReadRequest struct {
	AgentID      string          `json:"agentId"`
	KBIDs        []string        `json:"kbIds"`
	SourceIDs    []string        `json:"sourceIds"`
	CitationURI  string          `json:"citationUri"`
	Route        KBCitationRoute `json:"route"`
	SourceID     string          `json:"sourceId"`
	RepoID       string          `json:"repoId"`
	RepoRole     string          `json:"repoRole"`
	Ref          string          `json:"ref"`
	Path         string          `json:"path"`
	Slug         string          `json:"slug"`
	WikiSlug     string          `json:"wikiSlug"`
	Revision     string          `json:"revision"`
	HeadingsOnly bool            `json:"headingsOnly"`
	Section      string          `json:"section"`
	Offset       int             `json:"offset"`
	Limit        int             `json:"limit"`
	MaxBytes     int             `json:"maxBytes"`
	Format       string          `json:"format"`
}

func (r KBRetrievalReadRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBReadRequest {
	return kb.KBReadRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		CitationURI:         r.CitationURI,
		Route:               r.Route.Input(),
		SourceID:            r.SourceID,
		RepoID:              r.RepoID,
		RepoRole:            r.RepoRole,
		Path:                r.Path,
		Slug:                firstNonEmptyString(r.Slug, r.WikiSlug),
		Revision:            firstNonEmptyString(r.Revision, r.Ref),
		HeadingsOnly:        r.HeadingsOnly,
		Section:             r.Section,
		Offset:              r.Offset,
		Limit:               r.Limit,
		MaxBytes:            r.MaxBytes,
		Format:              r.Format,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBRetrievalTreeRequest struct {
	AgentID      string   `json:"agentId"`
	KBIDs        []string `json:"kbIds"`
	SourceIDs    []string `json:"sourceIds"`
	CitationURI  string   `json:"citationUri"`
	SourceID     string   `json:"sourceId"`
	RepoID       string   `json:"repoId"`
	RepoRole     string   `json:"repoRole"`
	Ref          string   `json:"ref"`
	Path         string   `json:"path"`
	Revision     string   `json:"revision"`
	Limit        int      `json:"limit"`
	Cursor       string   `json:"cursor"`
	Depth        int      `json:"depth"`
	Compact      bool     `json:"compact"`
	IncludePages *bool    `json:"includePages"`
	IncludeDirs  *bool    `json:"includeDirs"`
}

func (r KBRetrievalTreeRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBTreeRequest {
	return kb.KBTreeRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		CitationURI:         r.CitationURI,
		SourceID:            r.SourceID,
		RepoID:              r.RepoID,
		RepoRole:            r.RepoRole,
		Path:                r.Path,
		Revision:            firstNonEmptyString(r.Revision, r.Ref),
		Limit:               r.Limit,
		Cursor:              r.Cursor,
		Depth:               r.Depth,
		Compact:             r.Compact,
		IncludePages:        r.IncludePages,
		IncludeDirs:         r.IncludeDirs,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBCapabilitiesRequest struct {
	AgentID   string   `json:"agentId"`
	KBIDs     []string `json:"kbIds"`
	SourceIDs []string `json:"sourceIds"`
}

func (r KBCapabilitiesRequest) Input(actingUserID ...string) kb.KBCapabilitiesRequest {
	return kb.KBCapabilitiesRequest{
		AgentID:          r.AgentID,
		ActingUserID:     firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs: r.KBIDs,
		SourceIDs:        r.SourceIDs,
	}
}

type KBManifestRequest struct {
	AgentID   string   `json:"agentId"`
	KBIDs     []string `json:"kbIds"`
	SourceIDs []string `json:"sourceIds"`
	Limit     int      `json:"limit"`
	Depth     int      `json:"depth"`
	Compact   *bool    `json:"compact"`
}

func (r KBManifestRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBManifestRequest {
	return kb.KBManifestRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		Limit:               r.Limit,
		Depth:               r.Depth,
		Compact:             r.Compact,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBStatRequest struct {
	AgentID     string          `json:"agentId"`
	KBIDs       []string        `json:"kbIds"`
	SourceIDs   []string        `json:"sourceIds"`
	CitationURI string          `json:"citationUri"`
	Route       KBCitationRoute `json:"route"`
	SourceID    string          `json:"sourceId"`
	RepoID      string          `json:"repoId"`
	RepoRole    string          `json:"repoRole"`
	Ref         string          `json:"ref"`
	Path        string          `json:"path"`
	Slug        string          `json:"slug"`
	WikiSlug    string          `json:"wikiSlug"`
	Revision    string          `json:"revision"`
}

func (r KBStatRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBStatRequest {
	return kb.KBStatRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		CitationURI:         r.CitationURI,
		Route:               r.Route.Input(),
		SourceID:            r.SourceID,
		RepoID:              r.RepoID,
		RepoRole:            r.RepoRole,
		Path:                r.Path,
		Slug:                firstNonEmptyString(r.Slug, r.WikiSlug),
		Revision:            firstNonEmptyString(r.Revision, r.Ref),
		AuthorizationHeader: authorizationHeader,
	}
}

type KBBatchReadRequest struct {
	AgentID   string                   `json:"agentId"`
	KBIDs     []string                 `json:"kbIds"`
	SourceIDs []string                 `json:"sourceIds"`
	Items     []KBRetrievalReadRequest `json:"items"`
}

func (r KBBatchReadRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBBatchReadRequest {
	items := make([]kb.KBReadRequest, 0, len(r.Items))
	for _, item := range r.Items {
		items = append(items, item.Input(authorizationHeader, actingUserID...))
	}
	return kb.KBBatchReadRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		Items:               items,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBBatchTreeRequest struct {
	AgentID   string                   `json:"agentId"`
	KBIDs     []string                 `json:"kbIds"`
	SourceIDs []string                 `json:"sourceIds"`
	Items     []KBRetrievalTreeRequest `json:"items"`
}

func (r KBBatchTreeRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBBatchTreeRequest {
	items := make([]kb.KBTreeRequest, 0, len(r.Items))
	for _, item := range r.Items {
		items = append(items, item.Input(authorizationHeader, actingUserID...))
	}
	return kb.KBBatchTreeRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		KnowledgeBaseIDs:    r.KBIDs,
		SourceIDs:           r.SourceIDs,
		Items:               items,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBCitationRoute struct {
	KnowledgeBaseID string `json:"kbId"`
	SourceID        string `json:"sourceId"`
	RepoID          string `json:"repoId,omitempty"`
	RepoRole        string `json:"repoRole,omitempty"`
	Kind            string `json:"kind"`
	Path            string `json:"path,omitempty"`
	Slug            string `json:"slug"`
	Revision        string `json:"revision,omitempty"`
}

func (r KBCitationRoute) Input() kb.KBCitationRoute {
	return kb.KBCitationRoute{KnowledgeBaseID: r.KnowledgeBaseID, SourceID: r.SourceID, RepoID: r.RepoID, RepoRole: r.RepoRole, Kind: r.Kind, Path: r.Path, Slug: r.Slug, Revision: r.Revision}
}

func firstPositiveInt(values ...int) int {
	for _, value := range values {
		if value > 0 {
			return value
		}
	}
	return 0
}

func firstNonEmptyString(values ...string) string {
	for _, value := range values {
		if value != "" {
			return value
		}
	}
	return ""
}

type KBRetrievalSearchResponse struct {
	Citations []KBRetrievalCitation `json:"citations"`
	Total     int                   `json:"total"`
	HasMore   bool                  `json:"hasMore"`
	Truncated bool                  `json:"truncated"`
	Warnings  []string              `json:"warnings,omitempty"`
	Error     *KBStructuredError    `json:"error,omitempty"`
}

type KBRetrievalCitation struct {
	CitationID  string  `json:"citation_id"`
	Title       string  `json:"title"`
	Snippet     string  `json:"snippet"`
	SourceLabel string  `json:"source_label,omitempty"`
	Score       float64 `json:"score"`
}

type KBRetrievalFetchRequest struct {
	AgentID         string   `json:"agentId"`
	CitationIDs     []string `json:"citation_ids"`
	MaxCharsPerItem int      `json:"max_chars_per_item"`
}

func (r KBRetrievalFetchRequest) Input(authorizationHeader string, actingUserID ...string) kb.KBFetchRequest {
	return kb.KBFetchRequest{
		AgentID:             r.AgentID,
		ActingUserID:        firstNonEmptyString(actingUserID...),
		CitationIDs:         r.CitationIDs,
		MaxCharsPerItem:     r.MaxCharsPerItem,
		AuthorizationHeader: authorizationHeader,
	}
}

type KBRetrievalFetchResponse struct {
	Items    []KBRetrievalFetchItem `json:"items"`
	Warnings []string               `json:"warnings,omitempty"`
}

type KBRetrievalFetchItem struct {
	CitationID    string             `json:"citation_id"`
	Title         string             `json:"title,omitempty"`
	Content       string             `json:"content,omitempty"`
	SourceLabel   string             `json:"source_label,omitempty"`
	Truncated     bool               `json:"truncated,omitempty"`
	OriginalBytes int                `json:"originalBytes,omitempty"`
	Error         *KBStructuredError `json:"error,omitempty"`
}

type KBRetrievalContextResponse struct {
	KnowledgeBases []KBRetrievalContextKnowledgeBase `json:"knowledgeBases"`
}

type KBRetrievalContextKnowledgeBase struct {
	ID             string                     `json:"id"`
	Name           string                     `json:"name"`
	Description    string                     `json:"description"`
	Sources        []KBRetrievalContextSource `json:"sources"`
	HasMoreSources bool                       `json:"hasMoreSources"`
}

type KBRetrievalContextSource struct {
	SourceID        string `json:"sourceId"`
	SourceKind      string `json:"sourceKind"`
	RepoRole        string `json:"repoRole"`
	ResourceType    string `json:"resourceType"`
	ResourceID      string `json:"resourceId"`
	IndexStatus     string `json:"indexStatus"`
	RepoOwner       string `json:"repoOwner"`
	RepoName        string `json:"repoName"`
	RepoFullName    string `json:"repoFullName"`
	Revision        string `json:"revision,omitempty"`
	FreshnessStatus string `json:"freshnessStatus,omitempty"`
}

type KBRetrievalReadResponse struct {
	KnowledgeBaseID   string             `json:"knowledgeBaseId"`
	KnowledgeBaseName string             `json:"knowledgeBaseName"`
	SourceID          string             `json:"sourceId"`
	SourceKind        string             `json:"sourceKind"`
	RepoRole          string             `json:"repoRole"`
	ResourceType      string             `json:"resourceType"`
	ResourceID        string             `json:"resourceId"`
	IndexStatus       string             `json:"indexStatus"`
	RepoOwner         string             `json:"repoOwner"`
	RepoName          string             `json:"repoName"`
	RepoFullName      string             `json:"repoFullName"`
	Slug              string             `json:"slug"`
	Title             string             `json:"title"`
	Body              string             `json:"body"`
	Format            string             `json:"format,omitempty"`
	Truncated         bool               `json:"truncated,omitempty"`
	OriginalBytes     int                `json:"originalBytes,omitempty"`
	SHA               string             `json:"sha"`
	Revision          string             `json:"revision,omitempty"`
	FreshnessStatus   string             `json:"freshnessStatus,omitempty"`
	CitationURI       string             `json:"citationUri"`
	Route             KBCitationRoute    `json:"route"`
	Error             *KBStructuredError `json:"error,omitempty"`
}

type KBRetrievalTreeResponse struct {
	Entries    []KBRetrievalTreeEntry `json:"entries"`
	Total      int                    `json:"total,omitempty"`
	HasMore    bool                   `json:"hasMore,omitempty"`
	NextCursor string                 `json:"nextCursor,omitempty"`
	Error      *KBStructuredError     `json:"error,omitempty"`
}

type KBRetrievalTreeEntry struct {
	KnowledgeBaseID   string          `json:"knowledgeBaseId"`
	KnowledgeBaseName string          `json:"knowledgeBaseName"`
	SourceID          string          `json:"sourceId"`
	SourceKind        string          `json:"sourceKind"`
	RepoRole          string          `json:"repoRole"`
	ResourceType      string          `json:"resourceType"`
	ResourceID        string          `json:"resourceId"`
	IndexStatus       string          `json:"indexStatus"`
	RepoOwner         string          `json:"repoOwner"`
	RepoName          string          `json:"repoName"`
	RepoFullName      string          `json:"repoFullName"`
	Path              string          `json:"path"`
	Name              string          `json:"name"`
	Kind              string          `json:"kind"`
	Slug              string          `json:"slug,omitempty"`
	Title             string          `json:"title,omitempty"`
	IsDir             bool            `json:"isDir"`
	SHA               string          `json:"sha,omitempty"`
	Revision          string          `json:"revision,omitempty"`
	FreshnessStatus   string          `json:"freshnessStatus,omitempty"`
	Size              int64           `json:"size,omitempty"`
	CitationURI       string          `json:"citationUri,omitempty"`
	Route             KBCitationRoute `json:"route,omitempty"`
}

type KBCapabilitiesResponse struct {
	KnowledgeBases []KBCapabilityKnowledgeBase `json:"knowledgeBases"`
}

type KBCapabilityKnowledgeBase struct {
	ID          string                           `json:"id"`
	Name        string                           `json:"name"`
	Description string                           `json:"description"`
	Sources     []KBCapabilitySource             `json:"sources"`
	Operations  map[string]KBCapabilityOperation `json:"operations"`
}

type KBCapabilitySource struct {
	SourceID        string                           `json:"sourceId"`
	SourceKind      string                           `json:"sourceKind"`
	RepoRole        string                           `json:"repoRole"`
	ResourceType    string                           `json:"resourceType"`
	ResourceID      string                           `json:"resourceId"`
	IndexStatus     string                           `json:"indexStatus"`
	RepoOwner       string                           `json:"repoOwner"`
	RepoName        string                           `json:"repoName"`
	RepoFullName    string                           `json:"repoFullName"`
	Revision        string                           `json:"revision,omitempty"`
	FreshnessStatus string                           `json:"freshnessStatus,omitempty"`
	Operations      map[string]KBCapabilityOperation `json:"operations"`
}

type KBCapabilityOperation struct {
	Supported       bool     `json:"supported"`
	ReadOnly        bool     `json:"readOnly,omitempty"`
	Writable        bool     `json:"writable,omitempty"`
	BackendWritable bool     `json:"backendWritable"`
	MCPToolExposed  bool     `json:"mcpToolExposed"`
	TargetType      string   `json:"targetType,omitempty"`
	Limitations     []string `json:"limitations,omitempty"`
	PreferredTool   string   `json:"preferredTool,omitempty"`
}

type KBManifestResponse struct {
	KnowledgeBases []KBManifestKnowledgeBase `json:"knowledgeBases"`
	TotalSources   int                       `json:"totalSources"`
	TotalPages     int                       `json:"totalPages"`
	HasMore        bool                      `json:"hasMore,omitempty"`
}

type KBManifestKnowledgeBase struct {
	ID          string             `json:"id"`
	Name        string             `json:"name"`
	Description string             `json:"description"`
	Sources     []KBManifestSource `json:"sources"`
}

type KBManifestSource struct {
	SourceID        string                 `json:"sourceId"`
	SourceKind      string                 `json:"sourceKind"`
	RepoRole        string                 `json:"repoRole"`
	ResourceType    string                 `json:"resourceType"`
	ResourceID      string                 `json:"resourceId"`
	IndexStatus     string                 `json:"indexStatus"`
	RepoOwner       string                 `json:"repoOwner"`
	RepoName        string                 `json:"repoName"`
	RepoFullName    string                 `json:"repoFullName"`
	Revision        string                 `json:"revision,omitempty"`
	FreshnessStatus string                 `json:"freshnessStatus,omitempty"`
	Entries         []KBRetrievalTreeEntry `json:"entries"`
	PageCount       int                    `json:"pageCount"`
	DirCount        int                    `json:"dirCount"`
	HasMore         bool                   `json:"hasMore,omitempty"`
	NextCursor      string                 `json:"nextCursor,omitempty"`
	Error           *KBStructuredError     `json:"error,omitempty"`
}

type KBStatResponse struct {
	Exists            bool               `json:"exists"`
	KnowledgeBaseID   string             `json:"knowledgeBaseId,omitempty"`
	KnowledgeBaseName string             `json:"knowledgeBaseName,omitempty"`
	SourceID          string             `json:"sourceId,omitempty"`
	SourceKind        string             `json:"sourceKind,omitempty"`
	RepoRole          string             `json:"repoRole,omitempty"`
	ResourceType      string             `json:"resourceType,omitempty"`
	ResourceID        string             `json:"resourceId,omitempty"`
	IndexStatus       string             `json:"indexStatus,omitempty"`
	RepoOwner         string             `json:"repoOwner,omitempty"`
	RepoName          string             `json:"repoName,omitempty"`
	RepoFullName      string             `json:"repoFullName,omitempty"`
	Slug              string             `json:"slug,omitempty"`
	Title             string             `json:"title,omitempty"`
	SHA               string             `json:"sha,omitempty"`
	Revision          string             `json:"revision,omitempty"`
	FreshnessStatus   string             `json:"freshnessStatus,omitempty"`
	CitationURI       string             `json:"citationUri,omitempty"`
	Route             KBCitationRoute    `json:"route,omitempty"`
	Error             *KBStructuredError `json:"error,omitempty"`
}

type KBBatchReadResponse struct {
	Results []KBBatchReadItem `json:"results"`
}

type KBBatchReadItem struct {
	Index int                      `json:"index"`
	Page  *KBRetrievalReadResponse `json:"page,omitempty"`
	Error *KBStructuredError       `json:"error,omitempty"`
}

type KBBatchTreeResponse struct {
	Results []KBBatchTreeItem `json:"results"`
}

type KBBatchTreeItem struct {
	Index int                      `json:"index"`
	Tree  *KBRetrievalTreeResponse `json:"tree,omitempty"`
	Error *KBStructuredError       `json:"error,omitempty"`
}

type KBStructuredError struct {
	Code    string `json:"code"`
	Message string `json:"message"`
	Status  int    `json:"status,omitempty"`
}

type KBAuditEvent struct {
	ID              string `json:"id"`
	WorkspaceID     string `json:"workspaceId"`
	KnowledgeBaseID string `json:"knowledgeBaseId"`
	ActorID         string `json:"actorId"`
	Action          string `json:"action"`
	ResourceType    string `json:"resourceType"`
	ResourceID      string `json:"resourceId"`
	Summary         string `json:"summary"`
	Details         string `json:"details,omitempty"`
	CreatedAt       string `json:"createdAt"`
}

type KBSavedView struct {
	ID               string `json:"id"`
	WorkspaceID      string `json:"workspaceId"`
	OwnerPrincipalID string `json:"ownerPrincipalId"`
	Name             string `json:"name"`
	Slug             string `json:"slug"`
	Description      string `json:"description,omitempty"`
	Filter           string `json:"filter"`
	Visibility       string `json:"visibility"`
	CreatedAt        string `json:"createdAt"`
	UpdatedAt        string `json:"updatedAt"`
}

type KBSavedViewMutationRequest struct {
	Name        string `json:"name"`
	Description string `json:"description"`
	Filter      string `json:"filter"`
	Visibility  string `json:"visibility"`
}

func (r KBSavedViewMutationRequest) Input() kb.KBSavedViewMutation {
	return kb.KBSavedViewMutation{
		Name:        r.Name,
		Description: r.Description,
		Filter:      r.Filter,
		Visibility:  r.Visibility,
	}
}

type KBOverviewResponse struct {
	KnowledgeBaseID  string                      `json:"knowledgeBaseId"`
	Health           KBOverviewHealth            `json:"health"`
	Activity         []KBOverviewActivity        `json:"activity"`
	Alerts           []KBOverviewAlert           `json:"alerts"`
	RecommendedPaths []KBOverviewRecommendedPath `json:"recommendedPaths"`
	Sources          []KBOverviewSource          `json:"sources"`
}

type KBOverviewHealth struct {
	Status         string `json:"status"`
	TotalSources   int    `json:"totalSources"`
	ReadySources   int    `json:"readySources"`
	AttentionCount int    `json:"attentionCount"`
	StaleSources   int    `json:"staleSources"`
	FailedSources  int    `json:"failedSources"`
	PendingSources int    `json:"pendingSources"`
}

type KBOverviewActivity struct {
	ID           string `json:"id"`
	Kind         string `json:"kind"`
	ActorID      string `json:"actorId,omitempty"`
	Action       string `json:"action"`
	ResourceType string `json:"resourceType"`
	ResourceID   string `json:"resourceId"`
	Status       string `json:"status"`
	Summary      string `json:"summary"`
	CreatedAt    string `json:"createdAt"`
}

type KBOverviewAlert struct {
	ID        string `json:"id"`
	Severity  string `json:"severity"`
	Kind      string `json:"kind"`
	SourceID  string `json:"sourceId,omitempty"`
	Message   string `json:"message"`
	CreatedAt string `json:"createdAt"`
}

type KBOverviewRecommendedPath struct {
	ID       string `json:"id"`
	Label    string `json:"label"`
	Reason   string `json:"reason"`
	Href     string `json:"href"`
	SourceID string `json:"sourceId,omitempty"`
}

type KBOverviewSource struct {
	SourceID                        string                  `json:"sourceId"`
	Name                            string                  `json:"name"`
	SourceType                      string                  `json:"sourceType"`
	Status                          string                  `json:"status"`
	SyncStatus                      string                  `json:"syncStatus,omitempty"`
	IndexStatus                     string                  `json:"indexStatus,omitempty"`
	AnalysisStatus                  string                  `json:"analysisStatus,omitempty"`
	FreshnessStatus                 string                  `json:"freshnessStatus,omitempty"`
	RepoFullName                    string                  `json:"repoFullName,omitempty"`
	SourceRepositoryAccessProfile   string                  `json:"sourceRepositoryAccessProfile,omitempty"`
	SourceRepositoryAccessStatus    string                  `json:"sourceRepositoryAccessStatus,omitempty"`
	InsightsRepositoryAccessProfile string                  `json:"insightsRepositoryAccessProfile,omitempty"`
	InsightsRepositoryAccessStatus  string                  `json:"insightsRepositoryAccessStatus,omitempty"`
	Revision                        string                  `json:"revision,omitempty"`
	UpdatedAt                       string                  `json:"updatedAt"`
	ImportProgress                  *KBSourceImportProgress `json:"importProgress,omitempty"`
}

type KBSourceDetailResponse struct {
	KnowledgeBaseID  string                      `json:"knowledgeBaseId"`
	Source           KBSource                    `json:"source"`
	Health           KBOverviewHealth            `json:"health"`
	Activity         []KBOverviewActivity        `json:"activity"`
	Alerts           []KBOverviewAlert           `json:"alerts"`
	RecommendedPaths []KBOverviewRecommendedPath `json:"recommendedPaths"`
	Repositories     KBSourceDetailRepositories  `json:"repositories"`
	CurrentRevision  *KBSourceRevision           `json:"currentRevision,omitempty"`
	AnalysisRuns     []KBSourceAnalysisRun       `json:"analysisRuns"`
	Jobs             []KBSourceJob               `json:"jobs"`
}

type KBSourceDetailRepositories struct {
	Primary  *ResourceRepositoryRef `json:"canonical,omitempty"`
	Mirror   *ResourceRepositoryRef `json:"mirror,omitempty"`
	Insights *ResourceRepositoryRef `json:"insights,omitempty"`
}

type ResourceRepositoryRef struct {
	ID                        string `json:"id"`
	RepoRole                  string `json:"repoRole"`
	RepoOwner                 string `json:"repoOwner"`
	RepoName                  string `json:"repoName"`
	RepoFullName              string `json:"repoFullName"`
	RepoID                    string `json:"repoId,omitempty"`
	DefaultRef                string `json:"defaultRef,omitempty"`
	RepositoryAccessProfile   string `json:"repositoryAccessProfile,omitempty"`
	RepositoryAccessStatus    string `json:"repositoryAccessStatus,omitempty"`
	RepositoryAccessLastError string `json:"repositoryAccessLastError,omitempty"`
	UpdatedAt                 string `json:"updatedAt"`
}

type KBSourceRevision struct {
	ID                    string `json:"id"`
	SourceCommitSHA       string `json:"sourceCommitSha,omitempty"`
	InsightsCommitSHA     string `json:"insightsCommitSha,omitempty"`
	PublishedWikiRevision string `json:"publishedWikiRevision,omitempty"`
	FreshnessStatus       string `json:"freshnessStatus"`
	UpdatedAt             string `json:"updatedAt"`
}

type KBSourceAnalysisRun struct {
	ID                    string `json:"id"`
	Trigger               string `json:"trigger"`
	Status                string `json:"status"`
	InputKind             string `json:"inputKind"`
	OutputRepoRole        string `json:"outputRepoRole"`
	OutputCommitSHA       string `json:"outputCommitSha,omitempty"`
	PublishedWikiRevision string `json:"publishedWikiRevision,omitempty"`
	Stage                 string `json:"stage,omitempty"`
	Message               string `json:"message,omitempty"`
	PageCount             int    `json:"pageCount,omitempty"`
	Error                 string `json:"error,omitempty"`
	FinishedAt            string `json:"finishedAt,omitempty"`
	CreatedAt             string `json:"createdAt"`
	UpdatedAt             string `json:"updatedAt"`
}

type KBSourceJob struct {
	ID         string `json:"id"`
	JobType    string `json:"jobType"`
	Status     string `json:"status"`
	Stage      string `json:"stage,omitempty"`
	Message    string `json:"message,omitempty"`
	PageCount  int    `json:"pageCount,omitempty"`
	Error      string `json:"error,omitempty"`
	FinishedAt string `json:"finishedAt,omitempty"`
	CreatedAt  string `json:"createdAt"`
	UpdatedAt  string `json:"updatedAt"`
}
