package hottisThreeWayThermometer

import (
  "log"
  "fmt"
  "bytes"
  "encoding/base64"
  "encoding/binary"
  "udi/database"
)

type hottisThreeWayThermometerValues struct {
  Status uint8
//  Battery uint16
  SensorAddress1 uint64
  Value1 int32
  SensorAddress2 uint64
  Value2 int32
  SensorAddress3 uint64
  Value3 int32 
}


func Parse(fPort int, _ []byte, frmPayload string, variables *map[string]database.VariableType, attributes *map[string]interface{}, _ *database.Device) error {
  if fPort != 2 {
    return fmt.Errorf("Unexpected fPort %d", fPort)
  }

  b, err := base64.StdEncoding.DecodeString(frmPayload)
  if err != nil {
    return fmt.Errorf("Unable to base64-decode payload: %v", err)
  }

  var values hottisThreeWayThermometerValues
  err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &values)
  if err != nil {
    return fmt.Errorf("Unable to cast into struct: %v", err)
  }

  var value1 float32 = float32(values.Value1) / 128.0
  var value2 float32 = float32(values.Value2) / 128.0
  var value3 float32 = float32(values.Value3) / 128.0

  //log.Printf("Status: %d, Battery: %d", values.Status, values.Battery);
  log.Printf("Status: %d", values.Status);
  log.Printf("Sensor1: Addr: %d, Value: %f", values.SensorAddress1, value1);
  log.Printf("Sensor2: Addr: %d, Value: %f", values.SensorAddress2, value2);
  log.Printf("Sensor3: Addr: %d, Value: %f", values.SensorAddress3, value3);

  (*variables)["Temperature1"] = database.VariableType {
    Label: "Temperature1",
    Variable: "Temperature",
    Unit: "°C",
    Value: value1,
  }
  (*variables)["Temperature2"] = database.VariableType {
    Label: "Temperature2",
    Variable: "Temperature",
    Unit: "°C",
    Value: value2,
  }
  (*variables)["Temperature3"] = database.VariableType {
    Label: "Temperature3",
    Variable: "Temperature",
    Unit: "°C",
    Value: value3,
  }

  (*attributes)["Status"] = values.Status
  (*attributes)["SensorAddress1"] = values.SensorAddress1
  (*attributes)["SensorAddress2"] = values.SensorAddress2
  (*attributes)["SensorAddress3"] = values.SensorAddress3
  return nil
}