package main

import (
	"bytes"
	"compress/zlib"
	"encoding/json"
	"fmt"
	"time"

	"gopkg.in/zeromq/goczmq.v4"
)

type EDDN struct {
	SchemaRef string          `json:"$schemaRef"`
	Header    EDDNHeader      `json:"header"`
	Message   json.RawMessage `json:"message"`
}
type EDDNHeader struct {
	UploaderID       string    `json:"uploaderID"`
	SoftwareName     string    `json:"softwareName"`
	SoftwareVersion  string    `json:"softwareVersion"`
	GatewayTimestamp time.Time `json:"gatewayTimestamp"`
}

func main() {
	channel := goczmq.NewSubChanneler("tcp://eddn.edcd.io:9500", "")
	defer channel.Destroy()

	run := true
	for run {
		select {
		case rawMessage, ok := <-channel.RecvChan:
			if !ok {
				run = false
				continue
			}

			message, err := decodeMessage(rawMessage[0])
			if err != nil {
				fmt.Println(err.Error())
				run = false
				continue
			}

			fmt.Println(message.SchemaRef, message.Header.SoftwareName)
		}
	}
}

func decodeMessage(rawMessage []byte) (*EDDN, error) {
	r, err := zlib.NewReader(bytes.NewReader(rawMessage))
	if err != nil {
		return nil, err
	}
	defer r.Close()

	var message EDDN
	err = json.NewDecoder(r).Decode(&message)
	if err != nil {
		return nil, err
	}

	return &message, nil
}