package main

import (
	"log"
	"net"
	"os"
	"strconv"
	"time"

	"github.com/robfig/cron"
)

var err error

var bs = []byte(`
kind: Namespace
metadata:  #这是注释
   name: test
   list:
    - {id: 1,name: 张三,age: 12}
    - {id: 2,name: 李四,age: 13}
   data:
    - ["男厕位", 1]
    - ["男厕位", 2]
---

kind: bbb
name: aaa`)

/* Out put
{"kind":"Namespace","metadata":{"name":"test"}}
{"kind":"bbb","name":"aaa"}
*/
// func example() {
// 	reader := bytes.NewReader(bs)
// 	ext := runtime.RawExtension{}
// 	d := yaml.NewYAMLOrJSONDecoder(reader, 4096)
// 	//循环解析  yaml中---是分隔的意思,既一个yaml文件包含多个不同发json对象
// 	// for {
// 		if err := d.Decode(&ext); err != nil {
// 			if err == io.EOF {
// 				return
// 			}
// 			log.Println("parse err:",err)
// 			return
// 		}
// 		log.Println(string(ext.Raw))
// 	// }
// }

func main() {

	// example()

	// configfile, err := os.Open("gateway.yaml")
	// check(err)
	// defer configfile.Close()
	// configData,err := ioutil.ReadAll(configfile)
	// check(err)

	// reader := bytes.NewReader(configData)
	// ext := runtime.RawExtension{}
	// d := yaml.NewYAMLOrJSONDecoder(reader, 4096)
	// if err := d.Decode(&conf); err != nil {
	// 	if err == io.EOF {
	// 		return
	// 	}
	// 	log.Println("parse err:",err)
	// 	return
	// }
	// log.Println(string(ext.Raw))
	// err = json.NewDecoder(string(ext.Raw)).Decode(&conf)
	// check(err)
	// log.Println(conf.OPENTCPSETVER)

	go gw_router()
	go serial_run()
	c := cron.New()

	//获取数据防抖处理时间配置
	if conf.SYNEXTENSIONTIME {
		go getConf()
	}
	//有线方案,发送全部数据,包括gateway配置
	if conf.PROCATEGORY == PRO_CATEGORY_WIRED {
		go send_data(CODE1001)
	}

	//一分钟一次 同步数据
	c.AddFunc("0, *, *, *, *, *", func() {
		if conf.SYNDATA {
			if conf.PROCATEGORY == PRO_CATEGORY_WIRED {
				send_data(CODE1001)
			} else if conf.PROCATEGORY == PRO_CATEGORY_WIRELESS {
				yunhorn_hb_dpark_v1()
			}
		}
	})

	// c.AddFunc("*/10, *, *, *, *, *", func() {
	// devices := []Device{}
	// log.Println(string(build_data(1001,devices)))
	// })

	c.AddFunc("*/30, *, *, *, *, *", func() {
		//dpark客户需要拉取api获取数据防抖时间配置
		if conf.SYNEXTENSIONTIME {
			getConf()
		}
	})

	c.AddFunc("0, */10, *, *, *, *", savedata_cron)
	c.AddFunc("0, 0, 0, *, *, *", insertdata)
	c.AddFunc("0, 0, *, *, *, *", get_weather)
	//定时更新today字段,当前日期
	c.AddFunc("0, *, *, *, *, *", func() {
		t := time.Now()
		today = t.Format("2006-01-02")
	})
	c.Start()

	if conf.OPENTCPSETVER {

		go record_log_channel()

		tcp_port := strconv.Itoa(conf.TCPPORT)

		listener, err := net.Listen("tcp", "0.0.0.0:"+tcp_port)
		if err != nil {
			log.Printf("listen fail, err: %v\n", err)
			return
		}

		for {
			conn, err := listener.Accept()
			loragwMap.Store(conn.RemoteAddr().String(), conn)
			if err != nil {
				log.Printf("accept fail, err: %v\n", err)
				continue
			}
			//       go process(conn)
			go handleConn(conn)
		}
	} else {
		//如果不启动tcpserver,则需要执行这里 让程序不退出
		select {}
	}

}

func check(err error) {
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
}