﻿/*           INFINITY CODE           */
/*     https://infinity-code.com     */

using InfinityCode.uPano;
using InfinityCode.uPano.HotSpots;
using InfinityCode.uPano.Renderers.Base;
using UnityEngine;

namespace HutongGames.PlayMaker.Actions.uPano.HotSpots
{
    [ActionCategory(uPanoCategories.HOTSPOTS)]
    [Tooltip("Create a new HotSpot")]
    public class CreateHotSpots : FsmStateAction
    {
        [RequiredField]
        public FsmObject panorama;

        [RequiredField]
        public FsmFloat pan;

        [RequiredField]
        public FsmFloat tilt;

        [RequiredField]
        public FsmGameObject prefab;

        public FsmVector3 scale = Vector3.one;
        public FsmVector3 rotation = Vector3.zero;
        public FsmFloat distanceMultiplier = 0.95f;
        public FsmBool ignoreGlobalActions = false;

        public FsmObject storeInstance;

        public override void Reset()
        {
            panorama = null;
            pan = 0;
            tilt = 0;
            prefab = null;
            scale = Vector3.one;
            rotation = Vector3.zero;
            distanceMultiplier = 0.95f;
            ignoreGlobalActions = false;
            storeInstance = null;
        }

        public override void OnEnter()
        {
            DoEnter();
            Finish();
        }

        private void DoEnter()
        {
            if (panorama.IsNone)
            {
                Debug.LogError("Requires reference to a panorama or Pano Renderer");
                return;
            }

            GameObject go;

            if (panorama.Value is PanoRenderer) go = (panorama.Value as PanoRenderer).gameObject;
            else if (panorama.Value is Pano) go = (panorama.Value as Pano).gameObject;
            else if (panorama.Value is GameObject)
            {
                go = panorama.Value as GameObject;
                if (go.GetComponent<Pano>() == null)
                {
                    Debug.LogError("Panorama field should contain a reference to a panorama or Pano Renderer");
                    return;
                }
            }
            else
            {
                Debug.LogError("Panorama field should contain a reference to a panorama or Pano Renderer");
                return;
            }

            HotSpotManager manager = go.GetComponent<HotSpotManager>();
            if (manager == null) manager = go.AddComponent<HotSpotManager>();
            HotSpot hs = manager.Create(pan.Value, tilt.Value, prefab.Value);

            if (!scale.IsNone) hs.scale = scale.Value;
            if (!rotation.IsNone) hs.rotation = Quaternion.Euler(rotation.Value);
            if (!distanceMultiplier.IsNone) hs.distanceMultiplier = distanceMultiplier.Value;
            if (!ignoreGlobalActions.IsNone) hs.ignoreGlobalActions = ignoreGlobalActions.Value;

            if (!storeInstance.IsNone) storeInstance.Value = new ObjectWrapper(hs);
        }
    }
}