package models

import (
	"time"

	activeemeamod "github.com/tidbcloud/devops/models/activeemea"
	appmod "github.com/tidbcloud/devops/models/application"
	apprmod "github.com/tidbcloud/devops/models/approval"
	auditmod "github.com/tidbcloud/devops/models/audit"
	ccmod "github.com/tidbcloud/devops/models/cloudconfig"
	"github.com/tidbcloud/devops/models/github"
	jiramod "github.com/tidbcloud/devops/models/jira"
	jumpmod "github.com/tidbcloud/devops/models/jump"
	k8smod "github.com/tidbcloud/devops/models/k8supgrade"
	maintmod "github.com/tidbcloud/devops/models/maintenance"
	msgmod "github.com/tidbcloud/devops/models/message"
	opmod "github.com/tidbcloud/devops/models/operation"
	premmod "github.com/tidbcloud/devops/models/premiumupgrade"
	privmod "github.com/tidbcloud/devops/models/privilege"
	"github.com/tidbcloud/devops/models/release"
	rdtmod "github.com/tidbcloud/devops/models/remediationticket"
	tntmod "github.com/tidbcloud/devops/models/tenant"
	ubmod "github.com/tidbcloud/devops/models/userbehavior"
)

var Models = []interface{}{
	// release related
	&release.Release{}, &release.ReleaseTicket{}, &release.ReleaseTicketToGithubPR{},
	&release.ChangeDetail{}, &release.ChangeNotification{}, &release.Change{}, &release.ChangeDeployment{},
	// approval related
	&apprmod.Approval{}, &apprmod.ApprovalNode{}, &apprmod.ApprovalTask{}, &apprmod.ApprovalCCTask{}, &apprmod.ApprovalAdminTask{},
	// audit log related
	&auditmod.AuditLog{},
	// config attributes
	&ConfigAttributesV2{},
	// incident related
	&Incident{}, &IncidentLogItem{}, &IncidentPostMortem{}, &IncidentPostMortemTimelineItem{}, &IncidentPostMortemToDoAction{},
	// cluster maintenance window related
	&maintmod.ClusterMaintenance{},
	&maintmod.ClusterOpsMaintenanceWindow{},
	&maintmod.OpsExecutionWindow{},
	// tenant related
	&tntmod.Tenant{},
	// github related
	&github.GithubPullRequest{}, &github.GithubRepository{},
	// operation related
	&opmod.OperationInstance{}, &opmod.OperationInstanceAction{}, &opmod.OperationInstanceToTargetMapping{},
	// cloud config related
	&ccmod.ConfigurationChange{}, &ccmod.ConfigurationFileChange{}, &ccmod.ConfigurationVersionChange{}, &ccmod.ConfigurationComponentChange{}, &ccmod.ConfigurationChangeToCluster{}, &ccmod.ConfigurationChangeToTenantInit{}, &ccmod.ConfigurationChangeToTemplate{},
	&ccmod.DefaultConfigurationChange{}, &ccmod.DefaultConfigurationChangeRelease{}, &ccmod.DefaultConfigurationChangeItemRelease{}, &ccmod.DefaultConfigurationChangeItem{},
	// premium multi-cluster component upgrade related
	&premmod.UpgradePlan{}, &premmod.UpgradeTarget{}, &premmod.UpgradeStep{},
	// user behavior related
	&ubmod.Subscription{}, &ubmod.LarkChat{}, &ubmod.GTMEmailSuppression{},
	// k8s upgrade related
	&k8smod.K8sCluster{}, &k8smod.Task{},
	// application related
	&appmod.Application{}, &appmod.ApplicationToOwner{},
	// privilege related
	&privmod.Privilege{}, &privmod.PrivilegeBinding{},
	// remediation ticket related
	&rdtmod.RemediationTicket{}, &rdtmod.RemediationTicketLog{}, &rdtmod.RemediationTicketApprovals{},
	// jump related
	&jumpmod.Authorization{}, &jumpmod.Jump{},
	// message related
	&msgmod.EmailRecord{},
	// jira related
	&jiramod.Issue{}, &jiramod.IssueCustomerInfo{}, &jiramod.IssueSnapshot{}, &jiramod.IssueTriage{}, &jiramod.IssueTriageTagDefinition{},
	// active EMEA tenant report related
	&activeemeamod.CompanyDomainEnrichment{}, &activeemeamod.TenantCandidate{},
}

type ID uint64

type Base struct {
	ID        ID        `gorm:"primary_key;not null"`
	CreatedAt time.Time `gorm:"created_at;type:TIMESTAMP;not null;<-:create"` // create and read only
}

type Updatable struct {
	Base
	UpdatedAt *time.Time `gorm:"updated_at;type:TIMESTAMP"`
}

func (id ID) Uint64() uint64 {
	return uint64(id)
}

func (u Base) GetID() ID {
	return u.ID
}
