package store

// Project represents a deployable application.
type Project struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	Registry    string `json:"registry"`
	Image       string `json:"image"`
	Port        int    `json:"port"`
	Healthcheck string `json:"healthcheck"`
	Env         string `json:"env"`     // JSON-encoded map
	Volumes     string `json:"volumes"` // JSON-encoded map
	CreatedAt   string `json:"created_at"`
	UpdatedAt   string `json:"updated_at"`
}

// Stage represents a deployment stage within a project (e.g. dev, rel, prod).
type Stage struct {
	ID           string `json:"id"`
	ProjectID    string `json:"project_id"`
	Name         string `json:"name"`
	TagPattern   string `json:"tag_pattern"`
	AutoDeploy   bool   `json:"auto_deploy"`
	MaxInstances int    `json:"max_instances"`
	Confirm      bool   `json:"confirm"`
	PromoteFrom  string `json:"promote_from"`
	Subdomain    string `json:"subdomain"`
	CreatedAt    string `json:"created_at"`
	UpdatedAt    string `json:"updated_at"`
}

// Registry represents a container image registry.
type Registry struct {
	ID        string `json:"id"`
	Name      string `json:"name"`
	URL       string `json:"url"`
	Type      string `json:"type"`
	Token     string `json:"token"`
	CreatedAt string `json:"created_at"`
	UpdatedAt string `json:"updated_at"`
}

// Settings holds global application configuration (single-row pattern).
type Settings struct {
	Domain           string `json:"domain"`
	ServerIP         string `json:"server_ip"`
	Network          string `json:"network"`
	SubdomainPattern string `json:"subdomain_pattern"`
	NotificationURL  string `json:"notification_url"`
	NpmURL           string `json:"npm_url"`
	NpmEmail         string `json:"npm_email"`
	NpmPassword      string `json:"npm_password"`
	WebhookSecret    string `json:"webhook_secret"`
	PollingInterval  string `json:"polling_interval"`
	UpdatedAt        string `json:"updated_at"`
}

// Instance represents a running (or stopped) container for a project stage.
type Instance struct {
	ID          string `json:"id"`
	StageID     string `json:"stage_id"`
	ProjectID   string `json:"project_id"`
	ContainerID string `json:"container_id"`
	ImageTag    string `json:"image_tag"`
	Subdomain   string `json:"subdomain"`
	NpmProxyID  int    `json:"npm_proxy_id"`
	Status      string `json:"status"` // running, stopped, failed, removing
	Port        int    `json:"port"`
	CreatedAt   string `json:"created_at"`
	UpdatedAt   string `json:"updated_at"`
}

// Deploy represents a deployment attempt.
type Deploy struct {
	ID         string `json:"id"`
	ProjectID  string `json:"project_id"`
	StageID    string `json:"stage_id"`
	InstanceID string `json:"instance_id"`
	ImageTag   string `json:"image_tag"`
	Status     string `json:"status"` // pending, pulling, starting, configuring_proxy, health_checking, success, failed, rolled_back
	StartedAt  string `json:"started_at"`
	FinishedAt string `json:"finished_at"`
	Error      string `json:"error"`
}

// DeployLog is a single log entry for a deploy.
type DeployLog struct {
	ID        int64  `json:"id"`
	DeployID  string `json:"deploy_id"`
	Message   string `json:"message"`
	Level     string `json:"level"` // info, warn, error
	CreatedAt string `json:"created_at"`
}

// StageEnv represents a per-stage environment variable override.
type StageEnv struct {
	ID        string `json:"id"`
	StageID   string `json:"stage_id"`
	Key       string `json:"key"`
	Value     string `json:"value"`
	Encrypted bool   `json:"encrypted"`
	CreatedAt string `json:"created_at"`
	UpdatedAt string `json:"updated_at"`
}

// Volume represents a volume mount configuration for a project.
type Volume struct {
	ID        string `json:"id"`
	ProjectID string `json:"project_id"`
	Source    string `json:"source"`
	Target   string `json:"target"`
	Mode     string `json:"mode"` // shared or isolated
	CreatedAt string `json:"created_at"`
	UpdatedAt string `json:"updated_at"`
}
