package user

import (
	"time"

	"gorm.io/gorm"
)

const (
	FamilyStatusActive   uint8 = 1
	FamilyRoleOwner      uint8 = 1
	FamilyRoleMember     uint8 = 2
	FamilyMemberActive   uint8 = 1
	FamilyMemberLeft     uint8 = 2
	FamilyMemberRemoved  uint8 = 3
	DefaultFamilyMaxSize int64 = 3
)

type UserFamily struct {
	Id          int64          `gorm:"primaryKey"`
	OwnerUserId int64          `gorm:"uniqueIndex:uniq_owner_user_id;not null;comment:Owner User ID"`
	MaxMembers  int64          `gorm:"not null;default:2;comment:Max members in family"`
	Status      uint8          `gorm:"type:tinyint(1);not null;default:1;comment:Status: 1=active, 0=disabled"`
	CreatedAt   time.Time      `gorm:"<-:create;comment:Creation Time"`
	UpdatedAt   time.Time      `gorm:"comment:Update Time"`
	DeletedAt   gorm.DeletedAt `gorm:"index;comment:Deletion Time"`
}

func (*UserFamily) TableName() string {
	return "user_family"
}

type UserFamilyMember struct {
	Id         int64          `gorm:"primaryKey"`
	FamilyId   int64          `gorm:"index:idx_family_status,priority:1;not null;comment:Family ID"`
	UserId     int64          `gorm:"uniqueIndex:uniq_user_id;not null;comment:Member User ID"`
	Role       uint8          `gorm:"type:tinyint(1);not null;default:2;comment:Role: 1=owner, 2=member"`
	Status     uint8          `gorm:"index:idx_family_status,priority:2;type:tinyint(1);not null;default:1;comment:Status: 1=active, 2=left, 3=removed"`
	JoinSource string         `gorm:"type:varchar(32);not null;default:'';comment:Join source"`
	JoinedAt   time.Time      `gorm:"not null;comment:Joined time"`
	LeftAt     *time.Time     `gorm:"default:NULL;comment:Left time"`
	CreatedAt  time.Time      `gorm:"<-:create;comment:Creation Time"`
	UpdatedAt  time.Time      `gorm:"comment:Update Time"`
	DeletedAt  gorm.DeletedAt `gorm:"index;comment:Deletion Time"`
}

func (*UserFamilyMember) TableName() string {
	return "user_family_member"
}
