using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Sci-Fi Ship Controller. Copyright (c) 2018-2023 SCSM Pty Ltd. All rights reserved.
namespace SciFiShipController
{
    /// <summary>
    /// Class containing ship input parameters.
    /// </summary>
    public class ShipInput
    {
        #region Public Variables - Input Data
        /// <summary>
        /// X-axis translational input. Range -1 to +1. Positive values result in rightward input, negative values result in leftward input.
        /// </summary>
        public float horizontal;
        /// <summary>
        /// Y-axis translational input. Range -1 to +1. Positive values result in upward input, negative values result in downward input.
        /// </summary>
        public float vertical;
        /// <summary>
        /// Z-axis translational input. Range -1 to +1. Positive values result in forward input, negative values result in backward input.
        /// </summary>
        public float longitudinal;

        /// <summary>
        /// X-axis rotational input. Range -1 to +1. Positive values result in downwards pitching input, negative values result in upwards pitching input.
        /// </summary>
        public float pitch;
        /// <summary>
        /// Y-axis rotational input. Range -1 to +1. Positive values result in rightwards turning input, negative values result in leftwards turning input.
        /// </summary>
        public float yaw;
        /// <summary>
        /// Z-axis rotational input. Range -1 to +1. Positive values result in rightwards rolling input, negative values result in leftwards rolling input.
        /// </summary>
        public float roll;

        /// <summary>
        /// Primary fire input. Boolean value.
        /// </summary>
        public bool primaryFire;
        /// <summary>
        /// Secondary fire input. Boolean value.
        /// </summary>
        public bool secondaryFire;
        
        /// <summary>
        /// Dock action input. Boolean value. Works when an initialised ShipDocking script is attached to an enabled ShipControlModule.
        /// This will trigger a docking action which will depend on which DockingState the ship is already in.
        /// </summary>
        public bool dock;

        #endregion

        #region Public Variables - Input Enablement (Advanced)
        // Generally you'll leave these all enabled. When you want
        // to update some axis in code while allowing the PlayerInputModule
        // to control everything else, you can just enable the axis
        // that you want to update and call shipControlModule.SendInput(shipInput).

        /// <summary>
        /// Should we use or discard data in the horizontal field? 
        /// </summary>
        public bool isHorizontalDataEnabled;
        /// <summary>
        /// Should we use or discard data in the vertical field?
        /// </summary>
        public bool isVerticalDataEnabled;
        /// <summary>
        /// Should we use or discard data in the longitudinal field?
        /// </summary>
        public bool isLongitudinalDataEnabled;
        /// <summary>
        /// Should we use or discard data in the pitch field?
        /// </summary>
        public bool isPitchDataEnabled;
        /// <summary>
        /// Should we use or discard data in the yaw field?
        /// </summary>
        public bool isYawDataEnabled;
        /// <summary>
        /// Should we use or discard data in the roll field?
        /// </summary>
        public bool isRollDataEnabled;
        /// <summary>
        /// Should we use or discard data in the primaryFire field?
        /// </summary>
        public bool isPrimaryFireDataEnabled;
        /// <summary>
        /// Should we use or discard data in the secondaryFire field?
        /// </summary>
        public bool isSecondaryFireDataEnabled;
        /// <summary>
        /// Should we use or discard data in the dock field?
        /// </summary>
        public bool isDockDataEnabled;

        #endregion

        #region Class Constructor
        public ShipInput()
        {
            // Input data fields
            horizontal = 0f;
            vertical = 0f;
            longitudinal = 0f;
            pitch = 0f;
            yaw = 0f;
            roll = 0f;
            primaryFire = false;
            secondaryFire = false;
            dock = false;
            // Update Enablement fields
            EnableAllData();
        }
        #endregion

        #region Public API Methods

        /// <summary>
        /// A quick way to set all is[axisname]DataEnabled fields to true
        /// </summary>
        public void EnableAllData()
        {
            isHorizontalDataEnabled = true;
            isVerticalDataEnabled = true;
            isLongitudinalDataEnabled = true;
            isPitchDataEnabled = true;
            isYawDataEnabled = true;
            isRollDataEnabled = true;
            isPrimaryFireDataEnabled = true;
            isSecondaryFireDataEnabled = true;
            isDockDataEnabled = true;
        }

        /// <summary>
        /// A quick way to set all is[axisname]DataEnabled fields to false
        /// </summary>
        public void DisableAllData()
        {
            isHorizontalDataEnabled = false;
            isVerticalDataEnabled = false;
            isLongitudinalDataEnabled = false;
            isPitchDataEnabled = false;
            isYawDataEnabled = false;
            isRollDataEnabled = false;
            isPrimaryFireDataEnabled = false;
            isSecondaryFireDataEnabled = false;
            isDockDataEnabled = false;
        }

        #endregion
    }
}