// Package model 提供 meeting 模块的数据库模型
package model

import "time"

// MeetingRoom 会议房间模型，对应 meeting_rooms 表
// 记录会议的创建信息、主持人、容量、状态与生命周期时间点
// 对外使用 RoomCode（XXX-XXX-XXX）寻址，内部使用 ID（主键）寻址
type MeetingRoom struct {
	ID            int64      `json:"id" gorm:"primaryKey;autoIncrement"`                               // 会议房间唯一标识
	RoomCode      string     `json:"room_code" gorm:"size:20;not null;uniqueIndex"`                    // 用户可见的会议号 XXX-XXX-XXX，全局唯一
	Title         string     `json:"title" gorm:"size:200;not null"`                                   // 会议标题
	HostID        int64      `json:"host_id" gorm:"not null;index:idx_meeting_rooms_host_status,priority:1"` // 主持人用户 ID
	Type          int        `json:"type" gorm:"not null;default:1"`                                   // 会议类型：1=即时，2=预约
	PasswordHash  *string    `json:"-" gorm:"size:255"`                                                // 入会密码 bcrypt 哈希，NULL 表示无密码；JSON 始终剥离
	MaxMembers    int        `json:"max_members" gorm:"not null;default:50"`                           // 房间最大成员数
	Status        int        `json:"status" gorm:"not null;default:0;index:idx_meeting_rooms_host_status,priority:2"` // 状态：0=未开始，1=进行中，2=已结束
	ScheduledAt   *time.Time `json:"scheduled_at" gorm:"type:timestamp(0)"`                            // 预约开始时间，即时会议为 NULL
	StartedAt     *time.Time `json:"started_at" gorm:"type:timestamp(0)"`                              // 实际开始时间
	EndedAt       *time.Time `json:"ended_at" gorm:"type:timestamp(0)"`                                // 实际结束时间
	EndedReason   *string    `json:"ended_reason" gorm:"size:20"`                                      // 结束原因：host_ended / empty_ttl / admin_force / system_error
	Settings      string     `json:"settings" gorm:"type:jsonb;not null;default:'{}'"`                 // JSON 字符串，保存房间级开关
	CreatedAt     time.Time  `json:"created_at" gorm:"not null;autoCreateTime;type:timestamp(0);index:idx_meeting_rooms_host_status,priority:3,sort:desc"` // 创建时间
	UpdatedAt     time.Time  `json:"updated_at" gorm:"not null;autoUpdateTime;type:timestamp(0)"`      // 更新时间
}

// TableName 指定数据库表名
func (MeetingRoom) TableName() string {
	return "meeting_rooms"
}
