// Package gb28181 实现了GB28181协议相关的功能
package gb28181

import (
	"time"
)

// PlatformModel 表示GB28181平台的配置信息。
// 包含了平台的基本信息、SIP服务配置、设备信息、认证信息等。
// 用于存储和管理GB28181平台的所有相关参数。
type PlatformModel struct {
	ID                      uint32 `gorm:"primaryKey;autoIncrement"`                                          // ID表示数据库中的唯一标识符
	Enable                  *bool  `gorm:"column:enable" json:"enable"`                                       // Enable表示该平台配置是否启用
	Name                    string `gorm:"column:name;omitempty" json:"name"`                                 // Name表示平台的名称
	ServerGBID              string `gorm:"column:server_gb_id;omitempty" json:"serverGBId"`                   // ServerGBID表示SIP服务器的国标编码
	ServerGBDomain          string `gorm:"column:server_gb_domain;omitempty" json:"serverGBDomain"`           // ServerGBDomain表示SIP服务器的国标域
	ServerIP                string `gorm:"column:server_ip;omitempty" json:"serverIp"`                        // ServerIP表示SIP服务器的IP地址
	ServerPort              int    `gorm:"column:server_port;omitempty" json:"serverPort"`                    // ServerPort表示SIP服务器的端口号
	DeviceGBID              string `gorm:"column:device_gb_id;omitempty" json:"deviceGBId"`                   // DeviceGBID表示设备的国标编号
	DeviceIP                string `gorm:"column:device_ip;omitempty" json:"deviceIp"`                        // DeviceIP表示设备的IP地址
	DevicePort              int    `gorm:"column:device_port;omitempty" json:"devicePort"`                    // DevicePort表示设备的端口号
	Username                string `gorm:"column:username;omitempty" json:"username"`                         // Username表示SIP认证的用户名，默认使用设备国标编号
	Password                string `gorm:"column:password;omitempty" json:"password"`                         // Password表示SIP认证的密码
	Expires                 int    `gorm:"column:expires;omitempty" json:"expires"`                           // Expires表示注册的过期时间，单位为秒
	KeepTimeout             int    `gorm:"column:keep_timeout;omitempty" json:"keepTimeout"`                  // KeepTimeout表示心跳超时时间，单位为秒
	Transport               string `gorm:"column:transport;omitempty" json:"transport"`                       // Transport表示传输协议类型
	CharacterSet            string `gorm:"column:character_set;omitempty" json:"characterSet"`                // CharacterSet表示字符集编码
	PTZ                     bool   `gorm:"column:ptz" json:"ptz"`                                             // PTZ表示是否允许云台控制
	RTCP                    bool   `gorm:"column:rtcp" json:"rtcp"`                                           // RTCP表示是否启用RTCP流保活
	Status                  bool   `gorm:"column:status" json:"status"`                                       // Status表示平台当前的在线状态
	ChannelCount            int    `gorm:"column:channel_count;omitempty" json:"channelCount"`                // ChannelCount表示通道数量
	CatalogSubscribe        bool   `gorm:"column:catalog_subscribe" json:"catalogSubscribe"`                  // CatalogSubscribe表示是否已订阅目录信息
	AlarmSubscribe          bool   `gorm:"column:alarm_subscribe" json:"alarmSubscribe"`                      // AlarmSubscribe表示是否已订阅报警信息
	MobilePositionSubscribe bool   `gorm:"column:mobile_position_subscribe" json:"mobilePositionSubscribe"`   // MobilePositionSubscribe表示是否已订阅移动位置信息
	CatalogGroup            int    `gorm:"column:catalog_group;omitempty" json:"catalogGroup"`                // CatalogGroup表示目录分组大小，每次向上级发送通道数量
	UpdateTime              string `gorm:"column:update_time;omitempty" json:"updateTime"`                    // UpdateTime表示最后更新时间
	CreateTime              string `gorm:"column:create_time;omitempty" json:"createTime"`                    // CreateTime表示创建时间
	AsMessageChannel        bool   `gorm:"column:as_message_channel" json:"asMessageChannel"`                 // AsMessageChannel表示是否作为消息通道使用
	SendStreamIP            string `gorm:"column:send_stream_ip;omitempty" json:"sendStreamIp"`               // SendStreamIP表示点播回复200OK时使用的IP地址
	AutoPushChannel         bool   `gorm:"column:auto_push_channel" json:"autoPushChannel"`                   // AutoPushChannel表示是否自动推送通道变化
	CatalogWithPlatform     int    `gorm:"column:catalog_with_platform;omitempty" json:"catalogWithPlatform"` // CatalogWithPlatform表示目录信息是否包含平台信息(0:关闭,1:打开)
	CatalogWithGroup        int    `gorm:"column:catalog_with_group;omitempty" json:"catalogWithGroup"`       // CatalogWithGroup表示目录信息是否包含分组信息(0:关闭,1:打开)
	CatalogWithRegion       int    `gorm:"column:catalog_with_region;omitempty" json:"catalogWithRegion"`     // CatalogWithRegion表示目录信息是否包含行政区划(0:关闭,1:打开)
	CivilCode               string `gorm:"column:civil_code;omitempty" json:"civilCode"`                      // CivilCode表示行政区划代码
	Manufacturer            string `gorm:"column:manufacturer;omitempty" json:"manufacturer"`                 // Manufacturer表示平台厂商
	Model                   string `gorm:"column:model;omitempty" json:"model"`                               // Model表示平台型号
	Address                 string `gorm:"column:address;omitempty" json:"address"`                           // Address表示平台安装地址
	RegisterWay             int    `gorm:"column:register_way;omitempty" json:"registerWay"`                  // RegisterWay表示注册方式(1:标准认证注册,2:口令认证,3:数字证书双向认证,4:数字证书单向认证)
	Secrecy                 int    `gorm:"column:secrecy;omitempty" json:"secrecy"`                           // Secrecy表示保密属性(0:不涉密,1:涉密)
}

// TableName 指定数据库表名
func (p *PlatformModel) TableName() string {
	return "platform_gb28181pro"
}

// NewPlatform 创建并返回一个新的Platform实例。
// 该函数会初始化Platform结构体，并设置一些默认值：
// - RegisterWay默认设置为1（标准认证注册模式）
// - Secrecy默认设置为0（不涉密）
// 返回值为指向新创建的Platform实例的指针。
func NewPlatform() *PlatformModel {
	now := time.Now().Format("2006-01-02 15:04:05")
	return &PlatformModel{
		RegisterWay: 1, // 默认使用标准认证注册模式
		Secrecy:     0, // 默认为不涉密
		CreateTime:  now,
		UpdateTime:  now,
	}
}
