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

namespace VLB
{
    public static class UtilsBeamProps
    {
        public static bool CanChangeDuringPlaytime(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.trackChangesDuringPlaytime;
            return true;
        }

        public static Quaternion GetInternalLocalRotation(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.beamInternalLocalRotation;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.beamInternalLocalRotation;

            return Quaternion.identity;
        }

        public static float GetThickness(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return Mathf.Clamp01(1 - (sd.fresnelPow / Consts.Beam.SD.FresnelPowMaxValue));

            var hd = self as VolumetricLightBeamHD;
            if (hd) return Mathf.Clamp01(1 - (hd.sideSoftness / Consts.Beam.HD.SideSoftnessMax));

            return 0f;
        }

        public static float GetFallOffEnd(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.fallOffEnd;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.fallOffEnd;

            return 0f;
        }

        public static ColorMode GetColorMode(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.usedColorMode;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.colorMode;

            return ColorMode.Flat;
        }

        public static Color GetColorFlat(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.color;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.colorFlat;

            return Color.white;
        }

        public static Gradient GetColorGradient(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.colorGradient;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.colorGradient;

            return null;
        }

        public static float GetConeAngle(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.coneAngle;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.coneAngle;

            return 0f;
        }

        public static float GetConeRadiusStart(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.coneRadiusStart;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.coneRadiusStart;

            return 0f;
        }

        public static float GetConeRadiusEnd(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.coneRadiusEnd;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.coneRadiusEnd;

            return 0f;
        }

        public static int GetSortingLayerID(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.sortingLayerID;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.GetSortingLayerID();

            return 0;
        }

        public static int GetSortingOrder(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.sortingOrder;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.GetSortingOrder();

            return 0;
        }

        public static bool GetFadeOutEnabled(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.isFadeOutEnabled;

            return false;
        }

        public static float GetFadeOutEnd(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.fadeOutEnd;

            return 0f;
        }

        public static Dimensions GetDimensions(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.dimensions;

            var hd = self as VolumetricLightBeamHD;
            if (hd) return hd.GetDimensions();

            return Dimensions.Dim3D;
        }

        public static int GetGeomSides(VolumetricLightBeamAbstractBase self)
        {
            var sd = self as VolumetricLightBeamSD;
            if (sd) return sd.geomSides;

            return Config.Instance.sharedMeshSides;
        }
    }
}
