package workspace

import (
	"time"

	modbase "github.com/tidbcloud/aisupport/services/ticket-manager/models/base"
)

type Workspace struct {
	modbase.Updatable

	Name                      string     `gorm:"column:name;type:varchar(255);not null"`
	Description               string     `gorm:"column:description;type:text;not null"`
	Severity                  string     `gorm:"column:severity;type:varchar(128);not null"`
	Type                      string     `gorm:"column:type;type:varchar(128);index:idx_type;not null"`
	Status                    string     `gorm:"column:status;type:varchar(128);index:idx_status;not null"`
	TaskListID                modbase.ID `gorm:"column:task_list_id;type:int;not null;default:0"`
	PrimaryChatGroupCRID      modbase.ID `gorm:"column:primary_chat_group_cr_id;type:int;not null;default:0"`
	StartedAt                 time.Time  `gorm:"column:started_at;type:TIMESTAMP;not null"`
	RecoveredAt               *time.Time `gorm:"column:recovered_at;type:TIMESTAMP"`
	ArchivedAt                *time.Time `gorm:"column:archived_at;type:TIMESTAMP"`
	LastSendOverviewMessageAt *time.Time `gorm:"column:last_send_overview_message_at;type:TIMESTAMP"`
	LastTimelineSyncAt        *time.Time `gorm:"column:last_timeline_sync_at;type:TIMESTAMP"`
	Configuration             []byte     `gorm:"column:configuration;type:json"`
}

func (Workspace) TableName() string {
	return "workspace_workspaces"
}

type WorkspaceMember struct {
	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;primaryKey;not null"`
	Role        string     `gorm:"column:role;type:varchar(128);primaryKey;not null"`
	Group       string     `gorm:"column:group;type:varchar(255);primaryKey;not null"`
	Email       string     `gorm:"column:email;type:varchar(255);primaryKey;not null"`
}

func (WorkspaceMember) TableName() string {
	return "workspace_members"
}

type IssueBinding struct {
	modbase.Base

	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_issue_binding_unique"`
	IssueKey    string     `gorm:"column:issue_key;type:varchar(255);not null;uniqueIndex:idx_workspace_issue_binding_unique"`
	BoundBy     string     `gorm:"column:bound_by;type:varchar(255);not null"`
}

func (IssueBinding) TableName() string {
	return "workspace_issue_bindings"
}

type AlertBinding struct {
	modbase.Base

	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_alert_binding_unique"`
	AlertKey    string     `gorm:"column:alert_key;type:varchar(255);not null;uniqueIndex:idx_workspace_alert_binding_unique"`
	BoundBy     string     `gorm:"column:bound_by;type:varchar(255);not null"`
}

func (AlertBinding) TableName() string {
	return "workspace_alert_bindings"
}

type TenantBinding struct {
	modbase.Base

	WorkspaceID  modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_tenant_binding_unique"`
	TenantID     string     `gorm:"column:tenant_id;type:varchar(255);not null;uniqueIndex:idx_workspace_tenant_binding_unique"`
	TenantName   string     `gorm:"column:tenant_name;type:varchar(255);not null"`
	TenantRegion string     `gorm:"column:tenant_region;type:varchar(255);not null"`
}

func (TenantBinding) TableName() string {
	return "workspace_tenant_bindings"
}

type ClusterBinding struct {
	modbase.Base

	WorkspaceID     modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_cluster_binding_unique"`
	ClusterID       string     `gorm:"column:cluster_id;type:varchar(255);not null;uniqueIndex:idx_workspace_cluster_binding_unique"`
	ClusterName     string     `gorm:"column:cluster_name;type:varchar(255);not null"`
	ClusterType     string     `gorm:"column:cluster_type;type:varchar(255);not null"`
	ClusterProvider string     `gorm:"column:cluster_provider;type:varchar(255);not null"`
	ClusterRegion   string     `gorm:"column:cluster_region;type:varchar(255);not null"`
}

func (ClusterBinding) TableName() string {
	return "workspace_cluster_bindings"
}

type CollaborationResourceBinding struct {
	modbase.Base

	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_collaboration_resource_binding_unique,priority:1"`
	ResourceID  modbase.ID `gorm:"column:resource_id;type:int;not null;uniqueIndex:idx_workspace_collaboration_resource_binding_unique,priority:2"`
	BoundBy     string     `gorm:"column:bound_by;type:varchar(255);not null"`
}

func (CollaborationResourceBinding) TableName() string {
	return "workspace_collaboration_resource_bindings"
}

type Advice struct {
	modbase.Updatable

	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;not null;index:idx_workspace_id"`
	Description string     `gorm:"column:description;type:text;not null"`
	Type        string     `gorm:"column:type;type:varchar(128);not null"`
	Status      string     `gorm:"column:status;type:varchar(128);not null;default:created"`
	Data        []byte     `gorm:"column:data;type:json"`
	AppliedAt   *time.Time `gorm:"column:applied_at;type:TIMESTAMP"`
}

func (Advice) TableName() string {
	return "workspace_advices"
}

type TimelineEvidence struct {
	modbase.Updatable

	WorkspaceID      modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_timeline_evidence_source;index:idx_workspace_timeline_evidence_workspace_time;index:idx_workspace_timeline_evidence_workspace_source_updated;index:idx_workspace_timeline_evidence_workspace_updated;index:idx_workspace_timeline_evidence_window,priority:1"`
	Source           string     `gorm:"column:source;type:varchar(64);not null;uniqueIndex:idx_workspace_timeline_evidence_source;index:idx_workspace_timeline_evidence_window,priority:2"`
	SourceType       string     `gorm:"column:source_type;type:varchar(64);not null;uniqueIndex:idx_workspace_timeline_evidence_source;index:idx_workspace_timeline_evidence_window,priority:3"`
	SourceKey        string     `gorm:"column:source_key;type:varchar(512);not null;uniqueIndex:idx_workspace_timeline_evidence_source"`
	OccurredAt       *time.Time `gorm:"column:occurred_at;type:datetime(3);index:idx_workspace_timeline_evidence_workspace_time;index:idx_workspace_timeline_evidence_window,priority:4"`
	SourceUpdatedAt  *time.Time `gorm:"column:source_updated_at;type:datetime(3);index:idx_workspace_timeline_evidence_workspace_source_updated"`
	ObservedAt       time.Time  `gorm:"column:observed_at;type:datetime(3);not null"`
	ActorID          string     `gorm:"column:actor_id;type:varchar(255)"`
	ActorDisplayName string     `gorm:"column:actor_display_name;type:varchar(255)"`
	Content          string     `gorm:"column:content;type:longtext"`
	ContentHash      string     `gorm:"column:content_hash;type:varchar(128);not null"`
	MetadataJSON     string     `gorm:"column:metadata_json;type:json;not null"`
}

func (TimelineEvidence) TableName() string {
	return "workspace_timeline_evidence"
}

type TimelineEntry struct {
	modbase.Updatable

	WorkspaceID  modbase.ID  `gorm:"column:workspace_id;type:int;not null;index:idx_workspace_timeline_entries_workspace_time;index:idx_workspace_timeline_entries_workspace_status"`
	OccurredAt   time.Time   `gorm:"column:occurred_at;type:datetime(3);not null;index:idx_workspace_timeline_entries_workspace_time"`
	SortOrder    *int        `gorm:"column:sort_order;type:int"`
	Title        string      `gorm:"column:title;type:text;not null"`
	Details      string      `gorm:"column:details;type:longtext"`
	EventKind    string      `gorm:"column:event_kind;type:varchar(128)"`
	Topic        string      `gorm:"column:topic;type:varchar(255)"`
	EntitiesJSON string      `gorm:"column:entities_json;type:json;not null"`
	Status       string      `gorm:"column:status;type:varchar(64);not null;index:idx_workspace_timeline_entries_workspace_status"`
	Source       string      `gorm:"column:source;type:varchar(64);not null"`
	Confidence   *float64    `gorm:"column:confidence;type:decimal(5,4)"`
	SupersededBy *modbase.ID `gorm:"column:superseded_by;type:int"`
	MetadataJSON string      `gorm:"column:metadata_json;type:json;not null"`
	Version      uint64      `gorm:"column:version;type:bigint;not null;default:1"`
	CreatedBy    string      `gorm:"column:created_by;type:varchar(255)"`
	UpdatedBy    string      `gorm:"column:updated_by;type:varchar(255)"`
}

func (TimelineEntry) TableName() string {
	return "workspace_timeline_entries"
}

type TimelineEntryEvidence struct {
	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;not null;index:idx_workspace_timeline_entry_evidence_workspace"`
	EntryID     modbase.ID `gorm:"column:entry_id;type:int;not null;primaryKey"`
	EvidenceID  modbase.ID `gorm:"column:evidence_id;type:int;not null;primaryKey;index:idx_workspace_timeline_entry_evidence_evidence"`
	Relation    string     `gorm:"column:relation;type:varchar(64);not null"`
	CreatedAt   time.Time  `gorm:"created_at;type:TIMESTAMP;not null;<-:create"`
}

func (TimelineEntryEvidence) TableName() string {
	return "workspace_timeline_entry_evidence"
}

type TimelineSummary struct {
	modbase.Updatable

	WorkspaceID  modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_timeline_summaries_workspace"`
	Summary      string     `gorm:"column:summary;type:text;not null"`
	Source       string     `gorm:"column:source;type:varchar(64);not null"`
	MetadataJSON string     `gorm:"column:metadata_json;type:json;not null"`
	CreatedBy    string     `gorm:"column:created_by;type:varchar(255)"`
	UpdatedBy    string     `gorm:"column:updated_by;type:varchar(255)"`
}

func (TimelineSummary) TableName() string {
	return "workspace_timeline_summaries"
}

type TimelineSyncState struct {
	modbase.Updatable

	WorkspaceID         modbase.ID `gorm:"column:workspace_id;type:int;not null;uniqueIndex:idx_workspace_timeline_sync_state"`
	Source              string     `gorm:"column:source;type:varchar(64);not null;uniqueIndex:idx_workspace_timeline_sync_state"`
	SourceType          string     `gorm:"column:source_type;type:varchar(64);not null;uniqueIndex:idx_workspace_timeline_sync_state"`
	SourceKey           string     `gorm:"column:source_key;type:varchar(512);not null;uniqueIndex:idx_workspace_timeline_sync_state"`
	LastSeenUpdatedAt   *time.Time `gorm:"column:last_seen_updated_at;type:datetime(3)"`
	LastSeenCursor      string     `gorm:"column:last_seen_cursor;type:varchar(512)"`
	LastSeenContentHash string     `gorm:"column:last_seen_content_hash;type:varchar(128)"`
	MetadataJSON        string     `gorm:"column:metadata_json;type:json;not null"`
}

func (TimelineSyncState) TableName() string {
	return "workspace_timeline_sync_states"
}

type TimelineEntryRevision struct {
	modbase.Base

	EntryID     modbase.ID `gorm:"column:entry_id;type:int;not null;index:idx_workspace_timeline_entry_revisions_entry"`
	WorkspaceID modbase.ID `gorm:"column:workspace_id;type:int;not null;index:idx_workspace_timeline_entry_revisions_workspace"`
	ChangedBy   string     `gorm:"column:changed_by;type:varchar(255);not null"`
	ChangeType  string     `gorm:"column:change_type;type:varchar(64);not null"`
	BeforeJSON  string     `gorm:"column:before_json;type:json"`
	AfterJSON   string     `gorm:"column:after_json;type:json"`
}

func (TimelineEntryRevision) TableName() string {
	return "workspace_timeline_entry_revisions"
}
