package vercel

import (
	"database/sql"
	"time"

	"github.com/google/wire"
)

var VercelDAOSet = wire.NewSet(NewVercelIntegrationConfigurationDAO, NewClusterConnectionDAO, NewTiDBVercelAccountDAO,
	NewComposeEntityDAO, NewDataAppConnectionDAO, NewEnvironmentIdentifierDAO, NewDataAppEnvironmentIdentifierDAO,
	NewXCheckDAO, NewBranchEnvironmentIdentifierDAO, NewBranchTaskDAO)

var MigrateTables = []interface{}{
	&ClusterConnection{},
	&VercelIntegrationConfiguration{},
	&EnvironmentIdentifier{},
	&TiDBVercelAccount{},
	&DataAppEnvironmentIdentifier{},
	&DataAppConnection{},
	&Check{},
	&BranchEnvironmentIdentifier{},
	&BranchTask{},
}

type VercelIntegrationConfiguration struct {
	ID        string `gorm:"primaryKey; not null; type:varchar(255)"`
	CreatedAt time.Time
	UpdatedAt time.Time

	UserID         string         `gorm:"not null;type:varchar(255)"`
	TeamID         sql.NullString `gorm:"type:varchar(255)"`
	ApiAccessToken string         `gorm:"column:api_access_token;type:varchar(255);not null"`
}

func (VercelIntegrationConfiguration) TableName() string {
	return "vercel_integration_configurations"
}

type ClusterConnection struct {
	ID        uint64 `gorm:"primaryKey"`
	CreatedAt time.Time
	UpdatedAt time.Time

	VercelProjectID string `gorm:"column:vercel_project_id;type:varchar(255);uniqueIndex:idx_vercel_project_id;not null"`
	TiDBOrgID       uint64 `gorm:"column:tidb_org_id;not null"`
	TiDBProjectID   uint64 `gorm:"column:tidb_project_id;not null"`
	TiDBClusterID   uint64 `gorm:"column:tidb_cluster_id;index:idx_tidb_cluster_id;not null"`
	FrameworkType   string `gorm:"column:framework_type;type:varchar(255);not null;default:'General'"`
	Database        string `gorm:"column:database;type:varchar(255);not null;default:'test'"`
	BranchEnabled   bool   `gorm:"column:branch_enabled;not null;default:false"`

	VercelIntegrationConfigurationID string `gorm:"column:vercel_integration_configuration_id;type:varchar(255);index:idx_vercel_integration_configuration_id;not null"`
	VercelIntegrationConfiguration   VercelIntegrationConfiguration

	EnvironmentIdentifier        EnvironmentIdentifier
	BranchEnvironmentIdentifiers []BranchEnvironmentIdentifier
}

func (ClusterConnection) TableName() string {
	return "cluster_connections"
}

type EnvironmentIdentifier struct {
	ID             uint64 `gorm:"primaryKey"`
	CreatedAt      time.Time
	UpdatedAt      time.Time
	TiDBHostID     sql.NullString `gorm:"column:tidb_host_id;type:varchar(255)"`
	TiDBPortID     sql.NullString `gorm:"column:tidb_port_id;type:varchar(255)"`
	TiDBUserID     sql.NullString `gorm:"column:tidb_user_id;type:varchar(255)"`
	TiDBPasswordID sql.NullString `gorm:"column:tidb_password_id;type:varchar(255)"`
	TiDBDatabaseID sql.NullString `gorm:"column:tidb_database_id;type:varchar(255)"`
	TiDBSslCaID    sql.NullString `gorm:"column:tidb_ssl_ca_id;type:varchar(255)"`
	DatabaseUrlID  sql.NullString `gorm:"column:database_url_id;type:varchar(255)"`

	ClusterConnectionID uint64 `gorm:"column:cluster_connection_id;index:idx_cluster_connection_id;not null"`
}

type TiDBVercelAccount struct {
	ID        uint64 `gorm:"primaryKey"`
	CreatedAt time.Time
	UpdatedAt time.Time

	TiDBOrgID           uint64 `gorm:"column:tidb_org_id;not null"`
	TiDBProjectID       uint64 `gorm:"column:tidb_project_id;not null"`
	TiDBClusterID       uint64 `gorm:"column:tidb_cluster_id;index:idx_tidb_cluster_id;uniqueIndex:idx_vercel_tidb_account;not null"`
	VercelProjectID     string `gorm:"column:vercel_project_id;type:varchar(255);index:idx_vercel_project_id;uniqueIndex:idx_vercel_tidb_account;not null"`
	TiDBClusterUsername string `gorm:"column:tidb_cluster_username;type:varchar(255);uniqueIndex:idx_vercel_tidb_account;not null"`
}

func (TiDBVercelAccount) TableName() string {
	return "tidb_vercel_accounts"
}

type DataAppConnection struct {
	ID        uint64 `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time

	VercelProjectID string `gorm:"column:vercel_project_id;type:varchar(255);uniqueIndex:idx_vercel_project_id;not null"`
	TiDBOrgID       uint64 `gorm:"column:tidb_org_id;not null"`
	TiDBProjectID   uint64 `gorm:"column:tidb_project_id;not null"`
	DataAppID       uint64 `gorm:"column:data_app_id;index:idx_data_app_id;not null"`

	VercelIntegrationConfigurationID string `gorm:"column:vercel_integration_configuration_id;type:varchar(255);index:idx_vercel_integration_configuration_id;not null"`
	VercelIntegrationConfiguration   VercelIntegrationConfiguration

	DataAppEnvironmentIdentifier DataAppEnvironmentIdentifier
}

func (DataAppConnection) TableName() string {
	return "data_app_connections"
}

type DataAppEnvironmentIdentifier struct {
	ID        uint64 `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time

	DataAppBaseUrl    sql.NullString `gorm:"column:data_app_base_url;type:varchar(255)"`
	DataAppPublicKey  sql.NullString `gorm:"column:data_app_public_key;type:varchar(255)"`
	DataAppPrivateKey sql.NullString `gorm:"column:data_app_private_key;type:varchar(255)"`

	DataAppConnectionID uint64 `gorm:"column:data_app_connection_id;index:idx_data_app_connection_id;not null"`
}

type Check struct {
	ID        string `gorm:"primarykey;not null;type:varchar(255)"`
	CreatedAt time.Time
	UpdatedAt time.Time

	DeploymentID    string `gorm:"column:deployment_id;type:varchar(255);not null"`
	VercelProjectID string `gorm:"column:vercel_project_id;type:varchar(255);not null"`
	GitBranchRef    string `gorm:"column:git_branch_ref;type:varchar(255);not null"`
	GitHubRepoID    string `gorm:"column:github_repo_id;type:varchar(255);not null"`

	VercelIntegrationConfigurationID string `gorm:"column:vercel_integration_configuration_id;type:varchar(255);index:idx_vercel_integration_configuration_id;not null"`
	VercelIntegrationConfiguration   VercelIntegrationConfiguration
}

type BranchEnvironmentIdentifier struct {
	ID             uint64 `gorm:"primaryKey"`
	CreatedAt      time.Time
	UpdatedAt      time.Time
	TiDBHostID     sql.NullString `gorm:"column:tidb_host_id;type:varchar(255)"`
	TiDBPortID     sql.NullString `gorm:"column:tidb_port_id;type:varchar(255)"`
	TiDBUserID     sql.NullString `gorm:"column:tidb_user_id;type:varchar(255)"`
	TiDBPasswordID sql.NullString `gorm:"column:tidb_password_id;type:varchar(255)"`
	TiDBDatabaseID sql.NullString `gorm:"column:tidb_database_id;type:varchar(255)"`
	DatabaseUrlID  sql.NullString `gorm:"column:database_url_id;type:varchar(255)"`

	BranchID     string `gorm:"column:branch_id;type:varchar(255);index:idx_branch_id;not null"`
	GitHubRepoID string `gorm:"column:github_repo_id;type:varchar(255);uniqueIndex:github_branch;not null"`
	GitBranchRef string `gorm:"column:git_branch_ref;type:varchar(255);uniqueIndex:github_branch;not null"`

	ClusterConnectionID uint64 `gorm:"column:cluster_connection_id;index:idx_cluster_connection_id;not null"`
	ClusterConnection   ClusterConnection
}

type TaskStatus string

const (
	Pending   TaskStatus = "pending"
	Completed TaskStatus = "completed"
	Timeout   TaskStatus = "timeout"
	Dropped   TaskStatus = "dropped"
)

type BranchTask struct {
	ID        uint64    `gorm:"primaryKey"`
	CreatedAt time.Time `gorm:"index"`
	UpdatedAt time.Time

	BranchID        string     `gorm:"column:branch_id;type:varchar(255);not null"`
	DeploymentID    string     `gorm:"column:deployment_id;type:varchar(255);not null"`
	DeploymentName  string     `gorm:"column:deployment_name;type:varchar(255);not null"`
	VercelProjectID string     `gorm:"column:vercel_project_id;type:varchar(255);not null"`
	Status          TaskStatus `gorm:"type:ENUM('pending','completed','timeout','dropped');not null;index"`
}

type TaskStatusCount struct {
	Status TaskStatus
	Count  int
}
