// Copyright (c) 2017 PSForever
package game

import org.specs2.mutable._
import net.psforever.packet._
import net.psforever.packet.game._
import net.psforever.types.{PlanetSideGUID, Vector3}
import scodec.bits._

class TriggerEffectMessageTest extends Specification {
  val string_motionalarmsensor = hex"51 970B 82 6F6E FA00C00000"
  val string_boomer            = hex"51 0000 93 737061776E5F6F626A6563745F656666656374 417BB2CB3B4F8E00000000"
  val string_boomer_explode    = hex"51 DF09 8F 6465746F6E6174655F626F6F6D6572 00"

  "decode (motion alarm sensor)" in {
    PacketCoding.decodePacket(string_motionalarmsensor).require match {
      case TriggerEffectMessage(guid, effect, unk, location) =>
        guid mustEqual PlanetSideGUID(2967)
        effect mustEqual "on"
        unk.isDefined mustEqual true
        unk.get.unk1 mustEqual true
        unk.get.unk2 mustEqual 1000L
        location.isDefined mustEqual false
      case _ =>
        ko
    }
  }

  "decode (boomer)" in {
    PacketCoding.decodePacket(string_boomer).require match {
      case TriggerEffectMessage(guid, effect, unk, location) =>
        guid mustEqual PlanetSideGUID(0)
        effect mustEqual "spawn_object_effect"
        unk.isDefined mustEqual false
        location.isDefined mustEqual true
        location.get.pos mustEqual Vector3(3567.0156f, 3278.6953f, 114.484375f)
        location.get.orient mustEqual Vector3(0, 0, 90)
      case _ =>
        ko
    }
  }

  "decode (boomer explode)" in {
    PacketCoding.decodePacket(string_boomer_explode).require match {
      case TriggerEffectMessage(guid, effect, unk, location) =>
        guid mustEqual PlanetSideGUID(2527)
        effect mustEqual "detonate_boomer"
        unk.isDefined mustEqual false
        location.isDefined mustEqual false
      case _ =>
        ko
    }
  }

  "encode (motion alarm sensor)" in {
    val msg = TriggerEffectMessage(PlanetSideGUID(2967), "on", true, 1000L)
    val pkt = PacketCoding.encodePacket(msg).require.toByteVector

    pkt mustEqual string_motionalarmsensor
  }

  "encode (boomer)" in {
    val msg =
      TriggerEffectMessage("spawn_object_effect", Vector3(3567.0156f, 3278.6953f, 114.484375f), Vector3(0, 0, 90))
    val pkt = PacketCoding.encodePacket(msg).require.toByteVector

    pkt mustEqual string_boomer
  }

  "encode (boomer explode)" in {
    val msg = TriggerEffectMessage(PlanetSideGUID(2527), "detonate_boomer")
    val pkt = PacketCoding.encodePacket(msg).require.toByteVector

    pkt mustEqual string_boomer_explode
  }
}
