﻿using JLGames.RocketDriver.Games.RpgMaterial.Common;

namespace JLGames.RocketDriver.Games.RpgMaterial.Service
{
    public class ValueCompareTrigger : ITriggerEntity
    {
        private readonly int m_TriggerId;

        private readonly int m_MType;
        private readonly int m_EId;
        private readonly Trigger.CompareType m_CType;
        private readonly int m_CValue;
        private readonly Trigger.TriggerInvoke m_InvokeFunc;
        private readonly bool m_Post;

        private int m_RemainTimes;

        public int TriggerId => m_TriggerId;
        public bool IsPost => m_Post;
        public int RemainTimes => m_RemainTimes;
        public bool RemainEmpty => m_RemainTimes == 0;

        public ValueCompareTrigger(int mType, int eId, Trigger.CompareType cType, int cValue, Trigger.TriggerInvoke invokeFunc
            , bool post = true, int times = -1)
        {
            m_TriggerId = Trigger.GenTriggerId();
            m_MType = mType;
            m_EId = eId;
            m_CType = cType;
            m_CValue = cValue;
            m_InvokeFunc = invokeFunc;
            m_Post = post;
            m_RemainTimes = times;
        }

        public bool Match(UserNotifyData data)
        {
            if (RemainEmpty || data.m_Id != m_EId || data.m_Type != m_MType) return false;
            switch (m_CType)
            {
                case Trigger.CompareType.Equal:
                    return data.Num == m_CValue;
                case Trigger.CompareType.NotEqual:
                    return data.Num != m_CValue;
                case Trigger.CompareType.Greater:
                    return data.Num > m_CValue;
                case Trigger.CompareType.Less:
                    return data.Num < m_CValue;
                case Trigger.CompareType.GreaterEqual:
                    return data.Num >= m_CValue;
                case Trigger.CompareType.LessEqual:
                    return data.Num <= m_CValue;
                default: return false;
            }
        }

        public void InvokeTrigger(UserNotifyData data)
        {
            m_InvokeFunc.Invoke(this, data);
            m_RemainTimes -= 1;
        }
    }
}