package protocol

import "time"

//数据上报类：
type QueryType uint8

const (
	QT_STATUSINFO          QueryType = iota //led内存、磁盘上报（平台主动，终端被动，调试用）
	QT_RESOLUTION                           //led分辨率上报（平台主动，终端被动）
	QT_POWERSTATUS                          //led开关机状态上报（1、有变化才上报；2、平台查询上报）
	QT_IFSTATUSS                            //led接口状态上报（平台主动，终端被动）
	QT_NETWORK                              //led网络状态上报（平台主动，终端被动）
	QT_PLAYINGINFO                          //led当前播放的节目上报（1、节目有变化才上报；2平台查询上报）
	QT_BRIGHTNESSCOLORTEMP                  //led音量、色温、亮度上报（平台主动，终端被动）
	QT_VOLUME                               //led音量、色温、亮度上报（平台主动，终端被动）
	QT_NTP                                  //NTP配置上报（平台主动，终端被动）
	QT_ACCOUNT                              //led账户信息上报（平台主动，终端被动）
	QT_VSNS                                 //led所有节目上报（平台主动，终端被动）
	QT_SCREENSHOT                           //led截屏（平台主动，终端被动）
	QT_LOCALE                               //led系统区域和语言（平台主动，终端被动）
	QT_RTCTIME                              //ledRTC时间
	QT_PGMS                                 //查询节目
	QT_SCHEDULE                             //查询排程
)

type QType struct {
	Flag  QueryType `json:"flag"` //查询类型标识
	State uint8
}

type LedState struct {
	Time  string `json:"time"`
	State uint8  `json:"state"` //0 在线，1离线
}

type Pack_LedState struct {
	Header
	Data LedState `json:"data"`
}

func (o Pack_LedState) EnCode(id string, gid string, seq uint64, changetime time.Time, state uint8) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Time = changetime.Format("2006-01-02 15:04:05")
	o.Data.State = state
	return json.MarshalToString(o)
}

func (o *Pack_LedState) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_QueryInfo struct {
	Header
	Data QType `json:"data"`
}

func (o *Pack_QueryInfo) EnCode(id, gid string, seq uint64, flag QueryType) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Flag = flag
	return json.MarshalToString(o)
}

func (o *Pack_QueryInfo) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_StatusInfo struct {
	Header
	Data StatusInfo `json:"data"`
}

func (o *Pack_StatusInfo) EnCode(id, gid string, seq uint64, si *StatusInfo) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *si
	return json.MarshalToString(o)
}

func (o *Pack_StatusInfo) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_Resolution struct {
	Header
	Data Resolution `json:"data"`
}

func (o *Pack_Resolution) EnCode(id, gid string, seq uint64, r *Resolution) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *r
	return json.MarshalToString(o)
}

func (o *Pack_Resolution) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type PowerstatusData struct {
	Powerstatus uint8 `json:"powerstatus"`
}
type Pack_PowerStatus struct {
	Header
	Data PowerstatusData `json:"data"`
}

func (o *Pack_PowerStatus) EnCode(id, gid string, seq uint64, powerstatus int) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Powerstatus = uint8(powerstatus)
	return json.MarshalToString(o)
}

func (o *Pack_PowerStatus) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_IFStatuss struct {
	Header
	Data IFStatuss `json:"data"`
}

func (o *Pack_IFStatuss) EnCode(id, gid string, seq uint64, ifs *IFStatuss) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *ifs
	return json.MarshalToString(o)
}

func (o *Pack_IFStatuss) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_PlayingInfo struct {
	Header
	Data PlayingInfo `json:"data"`
}

func (o *Pack_PlayingInfo) EnCode(id, gid string, seq uint64, pi *PlayingInfo) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *pi
	return json.MarshalToString(o)
}

func (o *Pack_PlayingInfo) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_BrightnessColortemp struct {
	Header
	Data BrightnessColortemp `json:"data"`
}

func (o *Pack_BrightnessColortemp) EnCode(id, gid string, seq uint64, bc *BrightnessColortemp) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *bc
	return json.MarshalToString(o)
}

func (o *Pack_BrightnessColortemp) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type VolumeData struct {
	Volume uint8 `json:"volume"`
}
type Pack_VolumeData struct {
	Header
	Data VolumeData `json:"data"`
}

func (o *Pack_VolumeData) EnCode(id, gid string, seq uint64, volume int) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Volume = uint8(volume)
	return json.MarshalToString(o)
}

func (o *Pack_VolumeData) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_Ntp struct {
	Header
	Data Ntp `json:"data"`
}

func (o *Pack_Ntp) EnCode(id, gid string, seq uint64, ntp *Ntp) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *ntp
	return json.MarshalToString(o)
}

func (o *Pack_Ntp) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_Account struct {
	Header
	Data Account `json:"data"`
}

func (o *Pack_Account) EnCode(id, gid string, seq uint64, acc *Account) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *acc
	return json.MarshalToString(o)
}

func (o *Pack_Account) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_VSNS struct {
	Header
	Data VSNS `json:"data"`
}

func (o *Pack_VSNS) EnCode(id, gid string, seq uint64, vsns *VSNS) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *vsns
	return json.MarshalToString(o)
}

func (o *Pack_VSNS) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_Locale struct {
	Header
	Data Locale `json:"data"`
}

func (o *Pack_Locale) EnCode(id, gid string, seq uint64, lc *Locale) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *lc
	return json.MarshalToString(o)
}

func (o *Pack_Locale) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Pack_RTCTime struct {
	Header
	Data RTCTime `json:"data"`
}

func (o *Pack_RTCTime) EnCode(id, gid string, seq uint64, rtc *RTCTime) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *rtc
	return json.MarshalToString(o)
}

func (o *Pack_RTCTime) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type BrightnessData struct {
	Brightness uint8 `json:"brightness"`
}
type Pack_BrightnessData struct {
	Header
	Data BrightnessData `json:"data"`
}

func (o *Pack_BrightnessData) EnCode(id, gid string, seq uint64, brightness int) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Brightness = uint8(brightness)
	return json.MarshalToString(o)
}

func (o *Pack_BrightnessData) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type ShowtoastData struct {
	Showtoast uint8 `json:"showtoast"`
}
type Pack_ShowtoastData struct {
	Header
	Data ShowtoastData `json:"data"`
}

func (o *Pack_ShowtoastData) EnCode(id, gid string, seq uint64, showtoast int) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Showtoast = uint8(showtoast)
	return json.MarshalToString(o)
}

func (o *Pack_ShowtoastData) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type CmdData struct {
	Cmd string `json:"cmd"`
}
type Pack_CmdData struct {
	Header
	Data CmdData `json:"data"`
}

func (o *Pack_CmdData) EnCode(id, gid string, seq uint64, cmd string) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Cmd = cmd
	return json.MarshalToString(o)
}

func (o *Pack_CmdData) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type ProgramData struct {
	Flag   uint8  `json:"flag"`   //flag=4清除缓存；flag=3清除节目缓存；flag=2清除节目；flag=1删除节目；flag=0切换节目
	Source string `json:"source"` //flag = 1或0时有效
	Vsn    string `json:"vsn"`    //flag = 1或0时有效
}
type Pack_ProgramData struct {
	Header
	Data ProgramData `json:"data"`
}

func (o *Pack_ProgramData) EnCode(id, gid string, seq uint64, flag uint8, source, vsn string) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Flag = flag
	o.Data.Source = source
	o.Data.Vsn = vsn
	return json.MarshalToString(o)
}

func (o *Pack_ProgramData) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type Host struct {
	Host string `json:"host"`
}
type Pack_Host struct {
	Header
	Data Host `json:"data"`
}

func (o *Pack_Host) EnCode(id, gid string, seq uint64, host string) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.Host = host
	return json.MarshalToString(o)
}

func (o *Pack_Host) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type RetHost struct {
	StateError
	Host string  `json:"host"`
	TTL  float64 `json:"ttl"`
}
type Pack_RetHost struct {
	Header
	Data RetHost `json:"data"`
}

func (o *Pack_RetHost) EnCode(id, gid string, seq uint64, err error, host string, ttl float64) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data.SetStateErrorData(err)
	o.Data.Host = host
	o.Data.TTL = ttl
	return json.MarshalToString(o)
}

func (o *Pack_RetHost) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

type PubGPMS struct {
	Name  string   `json:"name"`
	Files []string `json:"files"`
}
type Pack_PubGPMS struct {
	Header
	Data []PubGPMS `json:"data"`
}

func (o *Pack_PubGPMS) EnCode(id, gid string, seq uint64, pgms []PubGPMS) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = pgms
	return json.MarshalToString(o)
}

func (o *Pack_PubGPMS) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

//排程
type CmdOperation struct {
	AuthorUrl string `json:"author_url,omitempty"`
	Method    int    `json:"method,omitempty"`
	Content   string `json:"content,omitempty"`
	Source    string `json:"source,omitempty"`
	Vsn       string `json:"vsn,omitempty"`
}
type LimitDateTime struct {
	Start     string `json:"start,omitempty"`
	End       string `json:"end,omitempty"`
	StartTime string `json:"start_time,omitempty"`
	EndTime   string `json:"end_time,omitempty"`
}
type CommandSchedule struct {
	Operation      CmdOperation  `json:"operation"`
	OpTime         []string      `json:"op_time"`
	IfLimitDate    bool          `json:"if_limit_date"`
	LimitDate      LimitDateTime `json:"limit_date"`
	IfLimitWeekday bool          `json:"if_limit_weekday"`
	LimitWeekday   []bool        `json:"limit_weekday"`
	Type           string        `json:"type"`
}

type Pack_CommandSchedule struct {
	Header
	Data []CommandSchedule `json:"data"`
}

func (o *Pack_CommandSchedule) EnCode(id, gid string, seq uint64, cmdSchedule []CommandSchedule) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = cmdSchedule
	return json.MarshalToString(o)
}

func (o *Pack_CommandSchedule) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}

//info
type Storage struct {
	Total uint `json:"total"`
	Free  uint `json:"free"`
}
type PlayingInfo struct {
	Name   string `json:"name"`
	Path   string `json:"path"`
	Source string `json:"source"`
}
type InfoTag struct {
	Serialno string      `json:"serialno"`
	Model    string      `json:"model"`
	Mem      Storage     `json:"mem"`
	Storage  Storage     `json:"storage"`
	Playing  PlayingInfo `json:"playing"`
}
type StatusInfo struct {
	Info InfoTag `json:"info"`
}

//ifstatus
type Peer struct {
	Ip  string `json:"ip,omitempty"`
	Mac string `json:"mac,omitempty"`
}
type IPS struct {
	Broadcast string `json:"broadcast,omitempty"`
	Ip        string `json:"ip,omitempty"`
	Mask      string `json:"mask,omitempty"`
	Dns1      string `json:"dns1,omitempty"`
	Dns2      string `json:"dns2,omitempty"`
	Gateway   string `json:"gateway,omitempty"`
}
type SSID struct {
	SSID     string `json:"SSID,omitempty"`
	Pass     string `json:"pass,omitempty"`
	Priority int    `json:"priority,omitempty"`
}

type IFStatus struct {
	Type      string `json:"type,omitempty"`
	Connected int    `json:"connected,omitempty"`
	Enabled   int    `json:"enabled,omitempty"`
	Ips       *IPS   `json:"ips,omitempty"`
	Peers     []Peer `json:"peers,omitempty"`
	SSID      string `json:"SSID,omitempty"`
	Ssids     []SSID `json:"ssids,omitempty"`
	Operstate string `json:"operstate,omitempty"`
	Pass      string `json:"pass,omitempty"`
	Channel   int    `json:"channel,omitempty"`
	Carrier   int    `json:"carrier,omitempty"`
	Mode      string `json:"mode,omitempty"`
	Mac       string `json:"mac,omitempty"`
	Currentap string `json:"currentap,omitempty"`
	State     string `json:"state,omitempty"`
	Speed     int    `json:"speed,omitempty"`
	Strength  int    `json:"strength,omitempty"`
	Log       int    `json:"log,omitempty"`
	Isstatic  int    `json:"isstatic,omitempty"`
}

type IFStatuss struct {
	Types []IFStatus `json:"types,omitempty"`
}

type RTCTime struct {
	Time           string `json:"time"`
	Timezone       string `json:"timezone"`
	Isautotimezone int    `json:"isautotimezone"`
	Isautotime     int    `json:"isautotime"`
}

type Locale struct {
	Language string `json:"language"`
	Country  string `json:"country"`
}

type Resolution struct {
	Width      int `json:"width"`
	Height     int `json:"height"`
	Hsync      int `json:"hsync"`
	Dclk       int `json:"dclk"`
	RealWidth  int `json:"real_width"`
	RealHeight int `json:"real_height"`
	RealDclk   int `json:"real_dclk"`
	Fps        int `json:"fps"`
}

type BrightnessColortemp struct {
	Brightness int `json:"brightness"`
	Colortemp  int `json:"colortemperature"`
}

type Ntp struct {
	Ntpserver    string `json:"ntpserver"`
	Ntpinterval  int    `json:"ntpinterval"`
	Ntpthreshold int    `json:"ntpthreshold"`
}

type Account struct {
	Name         string `json:"name"`
	Password     string `json:"password"`
	Url          string `json:"url"`
	Devicestatus string `json:"devicestatus"`
	Internet     bool   `json:"internet"`
	Login        bool   `json:"login"`
	Reason       string `json:"reason"`
}

//vsn
type ContentTag struct {
	Md5          string `json:"md5,omitempty"`
	Name         string `json:"name,omitempty"`
	Publishedmd5 string `json:"publishedmd5,omitempty"`
	Size         uint   `json:"size,omitempty"`
}
type Contents struct {
	Content []ContentTag `json:"content"`
	Ressize uint         `json:"ressize,omitempty"`
	Type    string       `json:"type,omitempty"`
	Unused  uint         `json:"unused,omitempty"`
}
type Playing_Vsn struct {
	Name string `json:"name,omitempty"`
	Type string `json:"type,omitempty"`
}
type VSNS struct {
	Contents []Contents  `json:"contents,omitempty"`
	Playing  Playing_Vsn `json:"playing,omitempty"`
}

// CltledData 信息屏 数据
type CltledData struct {
	Powerstatus      int    `json:"powerstatus"`      //电源状态 1 0
	Musicvolume      int    `json:"musicvolume"`      //音量
	Brightness       int    `json:"brightness"`       //亮度
	Playing          string `json:"playing"`          //当前播放节目
	Colortemperature int    `json:"colortemperature"` //色温
	SleepTime        string `json:"sleepTime"`        //关机时间
	WakeupTime       string `json:"wakeupTime"`       //开机时间
	RebootTime       string `json:"rebootTime"`       //重启时间
	RealWidth        int    `json:"real_width"`       //宽度
	RealHeight       int    `json:"real_height"`      //高度
}

type Pack_LedCltledData struct {
	Header
	Data CltledData `json:"data"`
}

func (o *Pack_LedCltledData) EnCode(id, gid string, seq uint64, r *CltledData) (string, error) {
	o.SetHeaderData(id, gid, seq)
	o.Data = *r
	return json.MarshalToString(o)
}

func (o *Pack_LedCltledData) DeCode(message string) error {
	return json.UnmarshalFromString(message, o)
}
