package domain

import (
	"crypto/rand"
	"encoding/hex"
	"time"

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

type SharedLink struct {
	ID          string         `gorm:"primaryKey;type:uuid;default:gen_random_uuid()" json:"id"`
	TenantID    string         `gorm:"type:uuid;not null;index" json:"tenantId"`
	Token       string         `gorm:"uniqueIndex;not null" json:"token"`
	Name        string         `gorm:"not null" json:"name"` // 링크 식별을 위한 이름 (예: "24년 상반기 채용공고용")
	Description string         `json:"description"`
	AccessLevel string         `gorm:"default:'READ_ONLY'" json:"accessLevel"`
	IsActive    bool           `gorm:"default:true" json:"isActive"`
	ExpiresAt   *time.Time     `json:"expiresAt"`
	Password    string         `json:"-"` // 필요 시 비밀번호 (선택 사항)
	CreatedAt   time.Time      `json:"createdAt"`
	UpdatedAt   time.Time      `json:"updatedAt"`
	DeletedAt   gorm.DeletedAt `gorm:"index" json:"-"`

	// Relation
	Tenant Tenant `gorm:"foreignKey:TenantID" json:"-"`
}

func (s *SharedLink) BeforeCreate(tx *gorm.DB) (err error) {
	if s.ID == "" {
		s.ID = uuid.NewString()
	}
	if s.Token == "" {
		// 32바이트(64자)의 강력한 난수 토큰 생성
		b := make([]byte, 32)
		if _, err := rand.Read(b); err != nil {
			return err
		}
		s.Token = hex.EncodeToString(b)
	}
	return
}

func (s *SharedLink) IsValid() bool {
	if !s.IsActive {
		return false
	}
	if s.ExpiresAt != nil && s.ExpiresAt.Before(time.Now()) {
		return false
	}
	return true
}
