﻿using System;
using JLGames.RocketDriver.CSharp.DateTimex;
using UnityEngine;

namespace JLGames.RocketDriver.Games.RpgMaterial.Common
{
    [Serializable]
    public class MetaValidDuration
    {
        [Serializable]
        public enum Unit
        {
            Tick,
            Millisecond,
            Second,
            Minute,
            Hour,
            Day
        }

        [Tooltip("Duration Unit\n时长单位(ticks)")] [SerializeField]
        protected Unit m_DurationUnit;

        [Tooltip("Valid Duration(ticks)\n有效时长(ticks)")] [SerializeField]
        protected long m_ValidDuration;

        private long UnitTicks
        {
            get
            {
                switch (m_DurationUnit)
                {
                    case Unit.Day: return DateTimeUtil.TicksPerDay;
                    case Unit.Hour: return DateTimeUtil.TicksPerHour;
                    case Unit.Minute: return DateTimeUtil.TicksPerMinute;
                    case Unit.Second: return DateTimeUtil.TicksPerSecond;
                    case Unit.Millisecond: return DateTimeUtil.TicksPerMilliSecond;
                    default: return 1L;
                }
            }
        }

        /// <summary>
        /// Valid Duration
        /// 有效时长
        /// </summary>
        public long ValidDuration => m_ValidDuration;

        /// <summary>
        /// Valid Duration (Ticks)
        /// 有效时长 (Ticks)
        /// </summary>
        public long ValidTicks => m_ValidDuration * UnitTicks;

        /// <summary>
        /// Verify if enabled
        /// 验证是否启用
        /// </summary>
        public bool ValidEnabled => m_ValidDuration > 0;

        /// <summary>
        /// Check if it is within the valid date
        /// 检查是否在有效日期内
        /// </summary>
        /// <param name="passedTicks"></param>
        /// <returns></returns>
        public bool CheckInValid(long passedTicks)
        {
            return passedTicks < ValidTicks;
        }

        public override string ToString()
        {
            return $"{{ValidDuration={m_ValidDuration}}}";
        }

        public MetaValidDuration()
        {
        }

        public MetaValidDuration(long durationTicks)
        {
            m_DurationUnit = Unit.Tick;
            m_ValidDuration = durationTicks;
        }

        public MetaValidDuration(Unit durationUnit, long duration)
        {
            m_DurationUnit = durationUnit;
            m_ValidDuration = duration;
        }
    }
}