﻿
using UnityEngine;
using UltimateSurvival;
using System.Collections.Generic;

namespace ORKFramework.UltimateSurvival
{
	public class Settings : CorePlugin
	{
		[ORKEditorHelp("Forward Block Player", "Forward player control block changes to Ultimate Survival.", "")]
		[ORKEditorInfo("Ultimate Survival Settings", "The settings for Ultimate Survival integration.", "")]
		public bool forwardBlockPlayer = false;

		[ORKEditorHelp("Forward Block Camera", "Forward camera control block changes to Ultimate Survival.", "")]
		public bool forwardBlockCamera = false;

		[ORKEditorHelp("Show Cursor", "Show the mouse cursor when the camera controls are blocked.", "")]
		[ORKEditorInfo(endFoldout=true, indent=true)]
		[ORKEditorLayout("forwardBlockCamera", true, endCheckGroup=true)]
		public bool showCursor = false;


		// in-game
		private PlayerInputHandler playerInputHandler;


		/*
		============================================================================
		Instance functions
		============================================================================
		*/
		private static Settings instance;

		public Settings()
		{

		}

		public static Settings Instance
		{
			get
			{
				if(instance == null)
				{
					instance = ORK.Plugins.Get(typeof(Settings)) as Settings;
				}
				return instance;
			}
		}

		public override string Version
		{
			get { return "1.0.0"; }
		}


		/*
		============================================================================
		ORK Framework callback functions
		============================================================================
		*/
		public override void OnInitializeORK()
		{
			if(this.forwardBlockPlayer)
			{
				if(!this.RegisterPlayerControl())
				{
					ORK.Core.Tick += this.RegisterPlayerControlTick;
				}
				ORK.Control.BlockPlayerChanged += this.BlockPlayerChanged;
			}
			if(this.forwardBlockCamera)
			{
				if(!this.RegisterCameraControl())
				{
					ORK.Core.Tick += this.RegisterCameraControlTick;
				}
				if(this.showCursor)
				{
					ORK.Control.BlockCameraChanged += this.BlockCameraChanged;
				}
			}
		}

		public override void OnNewGame()
		{

		}

		public override void OnLoadGame()
		{

		}

		public override void Tick()
		{

		}

		public override void GUITick()
		{

		}

		public override void SceneLoaded()
		{
			if(this.forwardBlockPlayer &&
				!this.RegisterPlayerControl())
			{
				ORK.Core.Tick += this.RegisterPlayerControlTick;
			}
			if(this.forwardBlockCamera &&
				!this.RegisterCameraControl())
			{
				ORK.Core.Tick += this.RegisterCameraControlTick;
			}
		}

		public override bool Call(string info)
		{
			return false;
		}


		/*
		============================================================================
		Special callback functions
		============================================================================
		*/
		private void RegisterPlayerControlTick()
		{
			if(this.RegisterPlayerControl())
			{
				ORK.Core.Tick -= this.RegisterPlayerControlTick;
			}
		}

		public bool RegisterPlayerControl()
		{
			if(this.forwardBlockPlayer &&
				ORK.Instantiated &&
				GameController.LocalPlayer != null)
			{
				this.playerInputHandler = GameController.LocalPlayer.GetComponentInChildren<PlayerInputHandler>();
				if(this.playerInputHandler != null)
				{
					ORK.Control.AddPlayerControl(this.playerInputHandler);
					return true;
				}
			}
			return false;
		}

		public void BlockPlayerChanged(int change)
		{
			if(this.forwardBlockPlayer && 
				ORK.Control.Blocked)
			{
				if(this.playerInputHandler == null)
				{
					this.playerInputHandler = GameController.LocalPlayer.GetComponentInChildren<PlayerInputHandler>();
				}
				if(this.playerInputHandler != null)
				{
					this.playerInputHandler.Player.MovementInput.Set(Vector2.zero);
				}
			}
		}

		private void RegisterCameraControlTick()
		{
			if(this.RegisterCameraControl())
			{
				ORK.Core.Tick -= this.RegisterCameraControlTick;
			}
		}

		public bool RegisterCameraControl()
		{
			if(this.forwardBlockCamera &&
				ORK.Instantiated &&
				GameController.LocalPlayer != null)
			{
				MouseLook cameraControl = GameController.LocalPlayer.GetComponentInChildren<MouseLook>();
				if(cameraControl != null)
				{
					ORK.Control.AddCameraControl(cameraControl);
					return true;
				}
			}
			return false;
		}

		public void BlockCameraChanged(int change)
		{
			if(this.forwardBlockCamera && 
				this.showCursor)
			{
				if(ORK.Control.CameraBlocked)
				{
					Cursor.visible = true;
					Cursor.lockState = CursorLockMode.None;
				}
				else
				{
					Cursor.visible = false;
					Cursor.lockState = CursorLockMode.Locked;
				}
			}
		}
	}
}
