package model

import "time"

type Entity interface {
	GetTenantId() uint64
}

type Tenant struct {
	Id                        uint64
	Name                      string
	Alias                     string
	Email                     string
	Region                    string
	Plan                      string
	ThirdPartyAccountProvider string `gorm:"column:third_party_account_provider"`
}

func (t Tenant) GetTenantId() uint64 {
	return t.Id
}

type Cluster struct {
	TenantId   uint64 `gorm:"column:tenant_id"`
	TenantName string `gorm:"column:tenant_name"`
	Id         uint64
	Name       string
	Status     string
	Region     string
	CreatedAt  time.Time `gorm:"column:created_at"`
	FinishedAt time.Time `gorm:"column:finished_at"`
}

func (c Cluster) GetTenantId() uint64 {
	return c.TenantId
}

type Backup struct {
	TenantId   uint64 `gorm:"column:tenant_id"`
	TenantName string `gorm:"column:tenant_name"`
	ClusterId  uint64 `gorm:"column:cluster_id"`
	Id         uint64
	Status     string
	BsType     string `gorm:"column:schedule_type"`
	Region     string
	Message    string
	Size       uint64    `gorm:"column:backup_size"`
	CreatedAt  time.Time `gorm:"column:created_at"`
	FinishedAt time.Time `gorm:"column:finished_at"`
}

func (b Backup) GetTenantId() uint64 {
	return b.TenantId
}

type Restore struct {
	TenantId   uint64 `gorm:"column:tenant_id"`
	TenantName string `gorm:"column:tenant_name"`
	ClusterId  uint64 `gorm:"column:cluster_id"`
	Id         uint64
	Status     string
	Region     string
	Message    string
	CreatedAt  time.Time `gorm:"column:created_at"`
	FinishedAt time.Time `gorm:"column:finished_at"`
}

func (r Restore) GetTenantId() uint64 {
	return r.TenantId
}

type Import struct {
	TenantId   uint64 `gorm:"column:tenant_id"`
	TenantName string `gorm:"column:tenant_name"`
	ClusterId  uint64 `gorm:"column:cluster_id"`
	Id         uint64
	Status     string
	Region     string
	Message    string
	Size       uint64    `gorm:"column:total_size"`
	CreatedAt  time.Time `gorm:"column:created_at"`
	StartedAt  time.Time `gorm:"column:started_at"`
	FinishedAt time.Time `gorm:"column:finished_at"`
}

func (i Import) GetTenantId() uint64 {
	return i.TenantId
}

type ClusterOperation struct {
	TenantId    uint64 `gorm:"column:tenant_id"`
	TenantName  string `gorm:"column:tenant_name"`
	ClusterId   uint64 `gorm:"column:cluster_id"`
	Id          uint64
	Status      string
	Region      string
	Message     string
	Type        string
	CreatedAt   time.Time `gorm:"column:created_at"`
	CompletedAt time.Time `gorm:"column:completed_at"`
}

func (co ClusterOperation) GetTenantId() uint64 {
	return co.TenantId
}

type DFJob struct {
	TenantId      uint64 `gorm:"column:tenant_id"`
	Id            uint64
	CreatedAt     time.Time `gorm:"column:created_at"`
	UpdatedAt     time.Time `gorm:"column:updated_at"`
	DeletedAt     time.Time `gorm:"column:updated_at"`
	ProjectId     uint64
	ClusterId     uint64
	Name          string
	OneTime       bool
	Phase         string
	ServiceCode   string
	CreatorUid    uint64
	ProjectRegion string `gorm:"column:region"`
	Provider      string
	FinishedAt    time.Time
}

func (dfj DFJob) GetTenantId() uint64 {
	return dfj.TenantId
}

type Timestamp struct {
	Timestamp time.Time `gorm:"column:ts;primaryKey"`
}

func (ts Timestamp) GetTenantId() uint64 {
	return 0
}

type NoneEntity struct {
}

func (ne NoneEntity) GetTenantId() uint64 {
	return 0
}

type TenantRegionOveride struct {
	TenantId uint64 `gorm:"column:tenant_id"`
	Region   string `gorm:"column:region"`
}

func (Tenant) TableName() string {
	return "tmp_tenants"
}

func (Cluster) TableName() string {
	return "tmp_clusters"
}

func (Backup) TableName() string {
	return "tmp_backups"
}

func (Restore) TableName() string {
	return "tmp_restores"
}

func (Import) TableName() string {
	return "tmp_imports"
}

func (ClusterOperation) TableName() string {
	return "tmp_scalings"
}

func (DFJob) TableName() string {
	return "tmp_df_jobs"
}

func (Timestamp) TableName() string {
	return "tmp_timestamps"
}

func (TenantRegionOveride) TableName() string {
	return "tmp_real_region"
}

func (cluster Cluster) IsCreating() bool {
	switch cluster.Status {
	case "created", "initializing", "preparing", "launching":
		return true
	default:
		return false
	}
}

func (cluster Cluster) IsActive() bool {
	switch cluster.Status {
	case "cleared", "deletecomplete", "deleted", "unknown":
		return false
	default:
		return true
	}
}
