// リロードにかかる時間
const reloadDuration = 1.5;

// 銃の最大弾数
const totalBulletCount = 6;

// 黄色い光線のGameObjectをSubNodeとして取得
const ray = $.subNode("Ray");

// 残弾表示用のGameObjectをSubNodeとして取得
const canvas = $.subNode("Canvas");

$.onStart(() => {
  // このカウントがreloadDurationより小さい値になっている場合、リロード処理中であることを表す
  $.state.reloadCount = reloadDuration;

  // 掴んでいるプレイヤーのPlayerHandleを格納するstate
  $.state.grabberPlayer = null;
});

$.onGrab((isGrab, isLeftHand, player) => {

  // アイテムを掴んだ時の処理
  if (isGrab) {

    // 全弾チャージ
    setBulletCount(totalBulletCount);

    // アイテムを掴んだプレイヤーにPlayerScriptを適用する
    $.setPlayerScript(player);

    // PlayerScriptに"CanShoot"というメッセージを送信
    player.send("CanShoot", true);

    // このアイテムを掴んでいるプレイヤーの情報を更新
    $.state.grabberPlayer = player;

  // アイテムを手放した時の処理
  } else {

    // 黄色い光線を非表示にする
    setRayActive(false);

    // PlayerScriptに"Released"というメッセージを送信
    player.send("Released", null);

    // このアイテムを掴んでいるプレイヤーの情報を削除
    $.state.grabberPlayer = null;

  }

  // アイテムを掴んだ時は残弾数を表示、手放した時は残弾数を非表示
  canvas.setEnabled(isGrab);

});

$.onReceive((messageType, arg, sender) => {
  switch(messageType){

    // "Shoot"というメッセージを受信した時
    case "Shoot":
      // 射撃を行う
      shootBullet(sender);
      break;

    // "ShowRay"というメッセージを受信した時
    case "ShowRay":
      // argの真偽値に応じて黄色い光線の表示を切り替える
      setRayActive(arg);
      break;

    // "Reload"というメッセージを受信した時
    case "Reload":
      // リロード
      reloadBullet(sender);
      break;

    // どのcaseにも当てはまらない時
    default:
      break;

  }
},
// onReceiveにおいて、他のアイテムからのメッセージは受け取らず、PlayerScriptからのメッセージは受け取る設定
{ item: false , player: true });

// VR環境でも射撃ができるように、onUseに射撃を設定しておく
$.onUse((isDown, player) => {
  if (isDown) {
    shootBullet(player);
  }
});

$.onUpdate((deltaTime) => { 

  // stateを変数に格納
  let reloadCount = $.state.reloadCount;
  let grabberPlayer = $.state.grabberPlayer;

  // リロード状態の場合
  if (reloadCount < reloadDuration) { 
    reloadCount += deltaTime;

    // 一定時間してから弾数をリセットする
    if (reloadCount >= reloadDuration) { 

      // 全弾チャージ
      setBulletCount(totalBulletCount);

      // Play Audio Source Gimmickでリロード完了SEを再生するためのSignalを送信
      $.sendSignalCompat("this", "Reloaded");

      // Set Animator Value Gimmickでリロード用アニメーションを停止するためのSignalを送信
      $.setStateCompat("this", "Reloading", false);

      // アイテムを掴んでいるプレイヤーがいる場合は、PlayerScriptに"CanShoot"というメッセージを送信
      if (grabberPlayer != null) { 
        grabberPlayer.send("CanShoot", true);
      }
    }
  }

  // stateを更新
  $.state.reloadCount = reloadCount;

});

// 弾を撃つ処理
function shootBullet(player){

  // stateを変数に格納
  let bullet = $.state.bullet;

  // 弾が残っていなければ処理を終了
  if (bullet <= 0) return;

  // Create Item Gimmickで弾を生成するためのSignalを送信
  $.sendSignalCompat("this", "Shoot");

  // 残弾数を更新する
  bullet = bullet - 1;
  setBulletCount(bullet);

  // 残弾がなくなったらリロード開始
  if (bullet <= 0) {
    reloadBullet(player);
  }
}

// 残弾数を設定する処理
function setBulletCount(count) {
  // Set Fill Amount Gimmickで残弾数を表示するためのStateを更新
  $.setStateCompat("this", "Bullets", count);
  $.state.bullet = count;
}

// リロードを開始する処理
function reloadBullet(player) {

  $.state.reloadCount = 0.0;

  // PlayerScriptに"CanShoot"というメッセージを送信
  player.send("CanShoot", false);

  // Play Audio Source Gimmickでリロード開始SEを再生するためのSignalを送信
  $.sendSignalCompat("this", "Reload");

  // Set Animator Value Gimmickでリロード用アニメーションを開始するためのSignalを送信
  $.setStateCompat("this", "Reloading", true);
}

// 黄色い光線の表示を切り替える処理
function setRayActive(isActive) {
  // isActiveがtrueであれば光線を表示、falseであれば非表示にする
  ray.setEnabled(isActive); 
}