package main

import (
	"github.com/graarh/golang-socketio"
	"github.com/graarh/golang-socketio/transport"
	"log"
	"runtime"
	"time"
	"fmt"
	"io/ioutil"
	"encoding/json"
	"os"
	"strconv"
)
import . "github.com/alexellis/blinkt_go"


type colors map[string][3]int

type FileMessage struct {
	Name      string    `json:"Name"`
	Channel string 	`json:"Channel"`
	Type    string `json:"Type"`
	Payload [8][8]int `json:"Payload"`
}


func main() {
	brightness := 0.3
	display_server_host := "192.168.7.3"
	if "" != os.Getenv("DISPLAY_SERVER_HOST") {
		display_server_host = os.Getenv("DISPLAY_SERVER_HOST")
	}
	display_server_port := 80
	if "" != os.Getenv("DISPLAY_SERVER_PORT") {
		port, err := strconv.Atoi(os.Getenv("DISPLAY_SERVER_PORT"))
		if err == nil {
			display_server_port = port
		}	 
	}
	log.Println("--- Server: ", display_server_host, display_server_port)
    blinkt := NewBlinkt(brightness)
    blinkt.SetClearOnExit(true)
    blinkt.Setup()

    Delay(100)
        
	runtime.GOMAXPROCS(runtime.NumCPU())
	
	dat, err := ioutil.ReadFile("./colors.json")
	if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
  }

  var palette colors
  json.Unmarshal(dat, &palette)

	c, err := gosocketio.Dial(
		gosocketio.GetUrl(display_server_host, display_server_port, false),
		transport.GetDefaultWebsocketTransport())
	if err != nil {
		log.Fatal(err)
	}

	err = c.On("message", func(h *gosocketio.Channel, args string) {
		log.Println("--- Got message: ", args)
	})
	if err != nil {
		log.Fatal(err)
	}
	err = c.On("file", func(h *gosocketio.Channel, args FileMessage) {
		log.Println("--- Got json file: ", args)
		blinkt.Clear()
		for i, colorIndex := range args.Payload[0] {
			rgb := palette[strconv.Itoa(colorIndex)];
			blinkt.SetPixel(i, rgb[0], rgb[1], rgb[2])
      blinkt.Show()
		}
	})
	if err != nil {
		log.Fatal(err)
	}	

	err = c.On(gosocketio.OnDisconnection, func(h *gosocketio.Channel) {
		log.Fatal("Disconnected")
	})
	if err != nil {
		log.Fatal(err)
	}

	err = c.On(gosocketio.OnConnection, func(h *gosocketio.Channel) {
		log.Println("Connected")
	})
	if err != nil {
		log.Fatal(err)
	}

	for {
		time.Sleep(1 * time.Second)
	}	
	c.Close()

	log.Println(" [x] Complete")
}