package dto

import "github.com/tidbcloud/AgentTeam/internal/service/skills"

type Skill struct {
	ID                string            `json:"id"`
	WorkspaceID       string            `json:"workspaceId"`
	Slug              string            `json:"slug"`
	Name              string            `json:"name"`
	Description       string            `json:"description,omitempty"`
	StorageScope      string            `json:"storageScope"`
	StorageOwnerLogin string            `json:"storageOwnerLogin"`
	VisibilityScope   string            `json:"visibilityScope"`
	VisibilityOwnerID string            `json:"visibilityOwnerId"`
	SkillCount        int               `json:"skillCount"`
	IsActive          bool              `json:"isActive"`
	IsOfficial        bool              `json:"isOfficial"`
	Repositories      SkillRepositories `json:"repositories"`
	Role              string            `json:"role,omitempty"`
	CanManage         bool              `json:"canManage"`
	CreatedBy         string            `json:"createdBy,omitempty"`
	UpdatedBy         string            `json:"updatedBy,omitempty"`
	CreatedAt         string            `json:"createdAt"`
	UpdatedAt         string            `json:"updatedAt"`
}

type SkillRepositories struct {
	Primary *ResourceRepositoryRef `json:"canonical,omitempty"`
}

type SkillListResponse struct {
	Items   []Skill `json:"items"`
	Page    int     `json:"page"`
	PerPage int     `json:"perPage"`
	Total   int64   `json:"total"`
	HasMore bool    `json:"hasMore"`
}

type SkillCreateRequest struct {
	Name             string `json:"name"`
	RepoNameOverride string `json:"repoNameOverride,omitempty"`
	Description      string `json:"description"`
	StorageScope     string `json:"storageScope,omitempty"`
	VisibilityScope  string `json:"visibilityScope,omitempty"`
	TemplateLocale   string `json:"templateLocale,omitempty"`
	IsActive         *bool  `json:"isActive"`
}

func (r SkillCreateRequest) Input() skills.SkillCreateMutation {
	return skills.SkillCreateMutation{Name: r.Name, RepoNameOverride: r.RepoNameOverride, Description: r.Description, StorageScope: r.StorageScope, VisibilityScope: r.VisibilityScope, TemplateLocale: r.TemplateLocale, IsActive: r.IsActive}
}

type SkillUpdateRequest struct {
	Name            *string `json:"name"`
	Slug            *string `json:"slug"`
	Description     *string `json:"description"`
	IsActive        *bool   `json:"isActive"`
	VisibilityScope *string `json:"visibilityScope"`
}

func (r SkillUpdateRequest) Input() skills.SkillUpdateMutation {
	return skills.SkillUpdateMutation{Name: r.Name, Slug: r.Slug, Description: r.Description, IsActive: r.IsActive, VisibilityScope: r.VisibilityScope}
}

type SkillRepositoryDetectedSkill struct {
	Name        string   `json:"name,omitempty"`
	Description string   `json:"description,omitempty"`
	Path        string   `json:"path"`
	Layout      string   `json:"layout,omitempty"`
	SizeBytes   int64    `json:"sizeBytes"`
	Status      string   `json:"status"`
	IssueCode   string   `json:"issueCode,omitempty"`
	Frontmatter []string `json:"frontmatter,omitempty"`
}

type SkillRepositorySkillsResponse struct {
	Items     []SkillRepositoryDetectedSkill `json:"items"`
	Total     int                            `json:"total"`
	CommitSHA string                         `json:"commitSha,omitempty"`
	VersionID string                         `json:"versionId,omitempty"`
	Truncated bool                           `json:"truncated"`
	Limit     int                            `json:"limit"`
	IssueCode string                         `json:"issueCode,omitempty"`
}

type SkillRepositoryContentsReadRequest struct {
	Paths             []string `json:"paths"`
	ExpectedCommitSHA string   `json:"expectedCommitSha"`
	ExpectedVersionID string   `json:"expectedVersionId,omitempty"`
}

func (r SkillRepositoryContentsReadRequest) Input() skills.SkillRepositoryContentsRequest {
	return skills.SkillRepositoryContentsRequest{Paths: r.Paths, ExpectedCommitSHA: r.ExpectedCommitSHA, ExpectedVersionID: r.ExpectedVersionID}
}

type SkillRepositoryContent struct {
	Name    string `json:"name"`
	Path    string `json:"path"`
	Content string `json:"content"`
}

type SkillRepositoryContentsResponse struct {
	Items     []SkillRepositoryContent `json:"items"`
	CommitSHA string                   `json:"commitSha,omitempty"`
	VersionID string                   `json:"versionId,omitempty"`
}

type SkillImportWarning struct {
	Code       string `json:"code"`
	Message    string `json:"message"`
	Path       string `json:"path,omitempty"`
	SizeBytes  int64  `json:"sizeBytes,omitempty"`
	LimitBytes int64  `json:"limitBytes,omitempty"`
}

type SkillImportResponse struct {
	Skill          Skill                          `json:"skill"`
	ImportedSkills []SkillRepositoryDetectedSkill `json:"importedSkills"`
	CommitSHA      string                         `json:"commitSha,omitempty"`
	VersionID      string                         `json:"versionId,omitempty"`
	SkillCount     int                            `json:"skillCount"`
	Warnings       []SkillImportWarning           `json:"warnings,omitempty"`
}

type SkillRepositoryBackup struct {
	TagName   string `json:"tagName"`
	Name      string `json:"name"`
	CommitSHA string `json:"commitSha,omitempty"`
	VersionID string `json:"versionId,omitempty"`
	CreatedAt string `json:"createdAt,omitempty"`
}

type SkillRepositoryBackupListResponse struct {
	Items   []SkillRepositoryBackup `json:"items"`
	Page    int                     `json:"page"`
	PerPage int                     `json:"perPage"`
	HasMore bool                    `json:"hasMore"`
}

type SkillRepositoryBackupCreateRequest struct {
	Name string `json:"name,omitempty"`
}

func (r SkillRepositoryBackupCreateRequest) Input() skills.SkillRepositoryBackupCreateMutation {
	return skills.SkillRepositoryBackupCreateMutation{Name: r.Name}
}

type SkillRepositoryBackupRestoreRequest struct {
	TagName string `json:"tagName"`
}

type SkillVersion struct {
	ID               string `json:"id"`
	ContentID        string `json:"contentId"`
	ContentVersionID string `json:"contentVersionId"`
	RootDigest       string `json:"rootDigest"`
	FileCount        int    `json:"fileCount"`
	SizeBytes        int64  `json:"sizeBytes"`
	SkillCount       int    `json:"skillCount"`
	CreatedBy        string `json:"createdBy"`
	CreatedAt        string `json:"createdAt"`
}

type SkillVersionListResponse struct {
	Items   []SkillVersion `json:"items"`
	Page    int            `json:"page"`
	PerPage int            `json:"perPage"`
	HasMore bool           `json:"hasMore"`
}

type SkillVersionRollbackRequest struct {
	VersionID string `json:"versionId"`
}

type AgentSkillBindingRequest struct {
	Branch string `json:"branch"`
}

func (r AgentSkillBindingRequest) Input() skills.AgentSkillBindingMutation {
	return skills.AgentSkillBindingMutation{Branch: r.Branch}
}

type AgentSkillBindingResponse struct {
	AgentID string `json:"agentId"`
	SkillID string `json:"skillId,omitempty"`
	Branch  string `json:"branch,omitempty"`
	Unbound bool   `json:"unbound,omitempty"`
}

type AgentSkillBindingSummary struct {
	ID          string `json:"id"`
	WorkspaceID string `json:"workspaceId"`
	AgentID     string `json:"agentId"`
	SkillID     string `json:"skillId"`
	Branch      string `json:"branch,omitempty"`
	CreatedBy   string `json:"createdBy"`
	UpdatedBy   string `json:"updatedBy"`
	CreatedAt   string `json:"createdAt"`
	UpdatedAt   string `json:"updatedAt"`
}

type AgentSkillBindingSkill struct {
	SkillID          string                 `json:"skillId"`
	WorkspaceID      string                 `json:"workspaceId"`
	Slug             string                 `json:"slug,omitempty"`
	Name             string                 `json:"name"`
	Description      string                 `json:"description,omitempty"`
	ContentID        string                 `json:"contentId,omitempty"`
	ContentVersionID string                 `json:"contentVersionId,omitempty"`
	IsActive         bool                   `json:"isActive"`
	Role             string                 `json:"role,omitempty"`
	CanManage        bool                   `json:"canManage"`
	CanBind          bool                   `json:"canBind"`
	Repository       *ResourceRepositoryRef `json:"repository,omitempty"`
	UpdatedAt        string                 `json:"updatedAt"`
}

type AgentSkillBindingsResponse struct {
	OwnedAgents []AgentOwnership           `json:"ownedAgents"`
	Bindings    []AgentSkillBindingSummary `json:"bindings"`
	Skills      []AgentSkillBindingSkill   `json:"skills"`
}

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

type AgentAccessibleSkill struct {
	ID               string                 `json:"id"`
	WorkspaceID      string                 `json:"workspaceId"`
	Name             string                 `json:"name"`
	Description      string                 `json:"description,omitempty"`
	ContentID        string                 `json:"contentId,omitempty"`
	ContentVersionID string                 `json:"contentVersionId,omitempty"`
	Repository       *ResourceRepositoryRef `json:"repository,omitempty"`
	Branch           string                 `json:"branch,omitempty"`
	PermissionSetAt  string                 `json:"permissionSetAt"`
	UpdatedAt        string                 `json:"updatedAt"`
}

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

type SkillPermissionGrant struct {
	ID          string `json:"id"`
	WorkspaceID string `json:"workspaceId"`
	SkillID     string `json:"skillId"`
	SubjectType string `json:"subjectType"`
	SubjectID   string `json:"subjectId"`
	Role        string `json:"role"`
	CreatedBy   string `json:"createdBy"`
	UpdatedBy   string `json:"updatedBy"`
	CreatedAt   string `json:"createdAt"`
	UpdatedAt   string `json:"updatedAt"`
}

type SkillPermissionsResponse struct {
	MyRole    string                 `json:"myRole"`
	CanManage bool                   `json:"canManage"`
	Owner     *SkillPermissionGrant  `json:"owner,omitempty"`
	Members   []SkillPermissionGrant `json:"members"`
}

type SkillPermissionGrantRequest struct {
	SubjectType string `json:"subjectType"`
	SubjectID   string `json:"subjectId"`
	Role        string `json:"role"`
}

func (r SkillPermissionGrantRequest) Input() skills.SkillPermissionGrantMutation {
	return skills.SkillPermissionGrantMutation{SubjectType: r.SubjectType, SubjectID: r.SubjectID, Role: r.Role}
}
