package release

import (
	"time"

	"github.com/tidbcloud/devops/models/base"

	"gorm.io/gorm"
)

type (
	ReleaseType       string
	ReleaseStatus     string
	ReleaseTicketType string
)

const (
	ReleaseTypePeriodic ReleaseType = "periodic"

	ReleaseStatusBeforeRelease ReleaseStatus = "before_release"
	ReleaseStatusOpen          ReleaseStatus = "open"
	ReleaseStatusFinished      ReleaseStatus = "finished"

	ReleaseTicketTypeDM ReleaseTicketType = "dm"

	ReleaseTicketStatusReady = "READY FOR RELEASE"
	ReleaseTicketStatusDone  = "Done"
)

type ReleaseTicketToGithubPR struct {
	Name       string `gorm:"type:VARCHAR(255);primary_key;not null"`
	PRLocation string `gorm:"type:VARCHAR(255);primary_key;not null"`
}

func (ReleaseTicketToGithubPR) TableName() string {
	return "release_ticket_to_github_prs"
}

type ReleaseTicket struct {
	Name      string     `gorm:"type:VARCHAR(255);primary_key;not null"`       // ex: DM-8580
	CreatedAt time.Time  `gorm:"created_at;type:TIMESTAMP;not null;<-:create"` // create and read only
	UpdatedAt *time.Time `gorm:"updated_at;type:TIMESTAMP"`
	DeletedAt gorm.DeletedAt

	ReleaseID     base.ID           `gorm:"index:idx_release_id"`
	ReleaseName   *string           `gorm:"type:VARCHAR(255);index:idx_release_name"`
	Summary       string            `gorm:"type:VARCHAR(255)"`
	Status        string            `gorm:"type:VARCHAR(255);not null"`
	Type          ReleaseTicketType `gorm:"type:ENUM('dm');not null"`
	AssigneeEmail string            `gorm:"type:VARCHAR(255)"`

	GithubPRLocations []ReleaseTicketToGithubPR `gorm:"foreignKey:Name"`
}

func (ReleaseTicket) TableName() string {
	return "release_tickets"
}

type Release struct {
	base.Updatable

	Name          string        `gorm:"type:VARCHAR(255);uniqueIndex:idx_name;not null"`
	Type          ReleaseType   `gorm:"type:VARCHAR(255);not null"`
	WindowStartAt time.Time     `gorm:"type:TIMESTAMP"`
	WindowEndAt   time.Time     `gorm:"type:TIMESTAMP"`
	ClosedAt      *time.Time    `gorm:"type:TIMESTAMP"`
	Status        ReleaseStatus `gorm:"type:ENUM('before_release', 'open', 'finished');not null"`
}

func (Release) TableName() string {
	return "release_releases"
}
