package db

import (
	"time"

	"gorm.io/gorm"
)

var Models = []any{
	&UserdebugAuth{},
	&UserdebugAuthRecord{},
	&UserdebugFeatureConfig{},
	&AlertSubscriber{},
	&AlertQuota{},
	&AlertNotification{},
	&AlertmanagerToken{},
}

// userdubug

// gen:qs
type UserdebugAuth struct {
	gorm.Model
	ClusterID uint64    `gorm:"not null"`
	CreatedBy uint64    `gorm:"not null"`
	AuthCode  string    `gorm:"type:TEXT;not null"`
	Status    string    `gorm:"not null;type:ENUM('normal', 'revoked')"`
	ExpiresAt time.Time `gorm:"expires_at;type:TIMESTAMP"`
}

// gen:qs
type UserdebugAuthRecord struct {
	gorm.Model
	ClusterID     uint64         `gorm:"not null"`
	UserID        uint64         `gorm:"not null"`
	AuthID        uint64         `gorm:"not null"` // Authorization ID
	Auth          *UserdebugAuth `gorm:"foreignkey:AuthID"`
	AuthOperation string         `gorm:"not null;type:ENUM('authorize', 'revoke', 'query')"`
	TimeSpan      int            `gorm:"type:int(11)"`
}

// gen:qs
type UserdebugFeatureConfig struct {
	gorm.Model
	OrganizationID uint64 `gorm:"not null"`
	FeatureKey     string `gorm:"type:TEXT;not null"`
	Status         string `gorm:"not null;type:ENUM('enabled', 'disabled')"`
}

// alert

type AlertSubscriber struct {
	gorm.Model
	TenantID       uint64 `gorm:"not null;index:idx_tenant_project" json:"tenant_id"`
	ProjectID      uint64 `gorm:"index:idx_tenant_project" json:"project_id"`
	ClusterID      uint64 `gorm:"index:idx_cluster" json:"cluster_id"`
	SubscriberType string `gorm:"not null;type:ENUM('EMAIL', 'SLACK', 'ZOOM', 'FLASHDUTY', 'PAGERDUTY', 'WEBHOOK', 'LARK')" json:"subscriber_type"`
	Name           string `gorm:"type:VARCHAR(128)" json:"name"`
	UserID         uint64 `json:"user_id"`
	SlackUrl       string `gorm:"type:VARCHAR(255)" json:"slack_url"`
	ZoomUrl        string `gorm:"type:VARCHAR(255)" json:"zoom_url"`
	ZoomToken      string `gorm:"type:VARCHAR(255)" json:"zoom_token"`
	FlashDutyUrl   string `gorm:"type:VARCHAR(255);column:flashduty_url" json:"flashduty_url"`
	PagerDutyKey   string `gorm:"type:VARCHAR(255);column:pagerduty_key" json:"pagerduty_key"`
	WebhookUrl     string `gorm:"type:VARCHAR(2048);column:webhook_url" json:"webhook_url"`
	LarkWebhookUrl string `gorm:"type:VARCHAR(2048);column:lark_webhook_url" json:"lark_webhook_url"`
	LarkSecret     string `gorm:"type:VARCHAR(255);column:lark_secret" json:"lark_secret"`
}

type AlertQuota struct {
	ID                 uint `gorm:"primarykey"`
	CreatedAt          time.Time
	UpdatedAt          time.Time
	TenantID           uint64 `gorm:"not null;uniqueIndex:uniq_tenant" json:"tenant_id"`
	MaxSubscriberCount int    `gorm:"not null" json:"max_subscriber_count"`
}

type AlertNotification struct {
	ID           uint `gorm:"primarykey"`
	CreatedAt    time.Time
	UpdatedAt    time.Time
	TenantID     uint64 `gorm:"not null;index:idx_tenant" json:"tenant_id"`
	ProjectID    uint64 `gorm:"index:idx_project" json:"project_id"`
	ClusterID    uint64 `gorm:"not null;index:idx_cluster" json:"cluster_id"`
	SubscriberID uint64 `gorm:"not null" json:"subscriber_id"`
	AlertContent string `gorm:"not null" json:"alert_content"`
	Status       string `gorm:"not null;type:ENUM('start', 'success', 'failure')"`
	Message      string
}

type AlertmanagerToken struct {
	ID        uint      `gorm:"primarykey"`
	CreatedAt time.Time `gorm:"not null;index:idx_created_at"`
	UpdatedAt time.Time
	ExpiredAt *time.Time
	TenantID  uint64 `gorm:"not null;index:idx_tenant" json:"tenant_id"`
	Username  string `gorm:"not null" json:"username"`
	Password  string `gorm:"not null" json:"password"`
}
