package domain

import (
	"time"

	"github.com/google/uuid"
	"gorm.io/gorm"
)

// Tenant statuses
const (
	TenantStatusPending   = "pending"
	TenantStatusActive    = "active"
	TenantStatusSuspended = "suspended"
	TenantStatusDeleted   = "deleted"
)

// Tenant types
const (
	TenantTypePersonal     = "PERSONAL"
	TenantTypeCompany      = "COMPANY"
	TenantTypeCompanyGroup = "COMPANY_GROUP"
	TenantTypeOrganization = "ORGANIZATION"
	TenantTypeUserGroup    = "USER_GROUP"
)

// Tenant represents a tenant model stored in PostgreSQL.
type Tenant struct {
	ID          string         `gorm:"primaryKey;type:uuid;default:gen_random_uuid()" json:"id"`
	Type        string         `gorm:"not null;default:'PERSONAL'" json:"type"`   // PERSONAL, COMPANY, COMPANY_GROUP, ORGANIZATION, USER_GROUP
	ParentID    *string        `gorm:"type:uuid;index" json:"parentId,omitempty"` // 부모 테넌트 ID
	Name        string         `gorm:"not null" json:"name"`
	Slug        string         `gorm:"uniqueIndex;not null" json:"slug"`
	Description string         `json:"description"`
	Status      string         `gorm:"default:'pending'" json:"status"`
	Domains     []TenantDomain `gorm:"foreignKey:TenantID" json:"domains,omitempty"`
	Config      JSONMap        `gorm:"type:jsonb" json:"config,omitempty"`
	CreatedAt   time.Time      `json:"createdAt"`
	UpdatedAt   time.Time      `json:"updatedAt"`
	DeletedAt   gorm.DeletedAt `gorm:"index" json:"-"`
}

func (t *Tenant) IsActive() bool {
	return t.Status == TenantStatusActive
}

// BeforeCreate hook to generate UUID if not present.
func (t *Tenant) BeforeCreate(tx *gorm.DB) (err error) {
	if t.ID == "" {
		t.ID = uuid.NewString()
	}
	return
}
