package filemanager

import (
	"strings"
	"time"

	"gorm.io/gorm"

	"wucher/internal/shared/pkg/uuidv7"
)

type Attachment struct {
	ID         []byte    `gorm:"type:binary(16);primaryKey;column:id"`
	FileID     []byte    `gorm:"type:binary(16);not null;column:file_id;index:idx_attachments_file_id;uniqueIndex:uq_attachments_ref_file,priority:3"`
	RefType    string    `gorm:"type:varchar(64);not null;column:ref_type;index:idx_attachments_ref_sort,priority:1;index:idx_attachments_ref_category,priority:1;uniqueIndex:uq_attachments_ref_file,priority:1"`
	RefID      string    `gorm:"type:varchar(191);not null;column:ref_id;index:idx_attachments_ref_sort,priority:2;index:idx_attachments_ref_category,priority:2;uniqueIndex:uq_attachments_ref_file,priority:2"`
	Category   *string   `gorm:"type:varchar(64);column:category;index:idx_attachments_ref_category,priority:3"`
	SortOrder  int       `gorm:"type:int;not null;default:0;column:sort_order;index:idx_attachments_ref_sort,priority:3"`
	IsPrimary  bool      `gorm:"type:boolean;not null;default:false;column:is_primary"`
	AttachedBy []byte    `gorm:"type:binary(16);column:attached_by"`
	CreatedAt  time.Time `gorm:"column:created_at;index:idx_attachments_ref_sort,priority:4"`
	UpdatedAt  time.Time `gorm:"column:updated_at"`
	File       *File     `gorm:"foreignKey:FileID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
}

func (Attachment) TableName() string { return "attachments" }

func (a *Attachment) BeforeCreate(_ *gorm.DB) error {
	if len(a.ID) == 0 {
		a.ID = uuidv7.MustBytes()
	}
	if trimmed := strings.TrimSpace(a.RefType); trimmed != "" {
		a.RefType = trimmed
	}
	if trimmed := strings.TrimSpace(a.RefID); trimmed != "" {
		a.RefID = trimmed
	}
	if a.Category != nil {
		value := strings.TrimSpace(*a.Category)
		if value == "" {
			a.Category = nil
		} else {
			a.Category = &value
		}
	}
	return nil
}
