using Thousandto.Code.Center;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Thousandto.Code.Logic
{
    /// <summary>
    /// 帮会语音的设置
    /// </summary>
    public class GuildVoiceSetting : IGuildVoiceSetting
    {
        //是否是指挥者模式
        private bool _voiceIsCmderModel = false;
        //召集的时间
        private DateTime _recieveTogetherTime;
        private int _togetherCDTimeSpan = 300;//秒
        //全体静音的时间
        private DateTime _recieveAllMuteTime ;
        private int _allMuteCDTimeSpan = 30;//秒
        //麦权
        private bool _mcPermission = false;

        public bool McPermisson
        {
            get
            {
                //如果是自由模式,那么就是上麦,如果不是自由模式,那么就需要判断当前状态讲话状态
                //(!_voiceIsCmderModel || (_voiceIsCmderModel && GameCenter.GuildSystem.TalkState != VoiceState.None))
                return _mcPermission;
            }
            set
            {
                if (_mcPermission != value)
                {
                    _mcPermission = value;
                    ReqPlayerTalk();
                }
            }
        }

        public bool McIsMute
        {
            get
            {
                return GameCenter.RealTimeVoiceSystem.GetMicrophoneMute();
            }

            set
            {
                GameCenter.RealTimeVoiceSystem.SetMicrophoneMute(value);
            }
        }

        public bool VoiceModel
        {
            get
            {
                return _voiceIsCmderModel;
            }

            set
            {
                if (_voiceIsCmderModel != value)
                {
                    _voiceIsCmderModel = value;
                    ReqSetVoiceModel();
                }
            }
        }


        public string TogetherCDText
        {
            get
            {
                var ts = _recieveTogetherTime.AddSeconds(_togetherCDTimeSpan) - DateTime.Now;
                if (ts > TimeSpan.Zero)
                {
                    return Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_GUILD_VOICE_TOGETHER) + string.Format("[ff0000]{0:d2}:{1:d2}[-]", ts.Minutes, ts.Seconds);
                }
                return Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_GUILD_VOICE_TOGETHER);
            }
        }     

        public bool EnableCallTogether
        {
            get
            {
                return IsGuildLeader() && _recieveTogetherTime.AddSeconds(_togetherCDTimeSpan) < DateTime.Now; 
            }
           
        }

        public bool EnableChangeVoiceModel
        {
            get
            {               
                return IsGuildLeader();
            }
        }

        public bool EnableChangeMcPermisson
        {
            get
            {
                return _voiceIsCmderModel;
            }
        }


        public string AllMuteCDText
        {
            get
            {
                var ts = _recieveAllMuteTime.AddSeconds(_allMuteCDTimeSpan) - DateTime.Now;
                if (ts > TimeSpan.Zero)
                {
                    return Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_GUILD_VOICE_ALLMUTE) + string.Format("[ff0000]{0:d2}:{1:d2}[-]", ts.Minutes, ts.Seconds);
                }
                return Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_GUILD_VOICE_ALLMUTE);
            }
        }

        public bool EnableAllMute
        {
            get
            {
                return IsGuildLeader() && _recieveAllMuteTime.AddSeconds(_allMuteCDTimeSpan) < DateTime.Now;
            }
        }

        private bool IsGuildLeader()
        {
            //if (LocalPlayerRoot.LocalPlayer != null)
            //{
            //    var item = GameCenter.GuildSystem.OnGetGuildOfficial();
            //    if (item != null)
            //    {
            //        //官职(1普通成员,2长老,3副会长,4会长,0学徒)
            //        return item.Level == 3 || item.Level == 4;
            //    }
            //}
            return false;
        }

        #region//服务器处理
        #region//请求
        //请求讲话
        public void ReqPlayerTalk()
        {
            //发送给服务器一个我要讲话的需求
            //new MSG_Guild.ReqSetMicState() { state = (_mcPermission ? 1 : 0) }.Send();
        }
        //请求集合
        public void ReqCallTogether()
        {
            //这里给服务器发送一个集合的请求,应该会分发到所有的玩家
           // new MSG_Guild.ReqCallUpVoicer().Send();
        }

        public void ReqSetVoiceModel()
        {
            //发送给服务器一个模式改变的消息
            //new MSG_Guild.ReqModifyVoiceMode() { mode = _voiceIsCmderModel?1:0 }.Send();
        }


        public void ReqSetAllUserMute()
        {
            //new MSG_Guild.ReqSynVoiceMode().Send();
            //发送一个全体静音的消息
            _recieveAllMuteTime = DateTime.Now;
            _allMuteCDTimeSpan = 30;
        }

        #endregion

        #region//接受

        //接受模式改变的消息
        public void RespVoiceModelChanged(bool isCmderModel)
        {
            _voiceIsCmderModel = isCmderModel;
            //接受一个全体静音的消息
            _recieveAllMuteTime = DateTime.Now;
            _allMuteCDTimeSpan = 30;
        }

        //获得集合请求调用成功的消息
        public void RespTogetherSuccess()
        {
            _recieveTogetherTime = DateTime.Now;
            _togetherCDTimeSpan = 300;
        }

        //接收到集合消息
        public void RespTogetther()
        {
            _recieveTogetherTime = DateTime.Now;
            _togetherCDTimeSpan = 300;

            GameCenter.MsgPromptSystem.ShowMsgBox(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_GUILD_VOICE_TOGETHER_MSG_TEXT), Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_MSSAGEBOX_CANCEL), Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_MSSAGEBOX_OK), x =>
            {
                if (x == MsgBoxResultCode.Button2)
                {
                    GameCenter.RealTimeVoiceSystem.ReqChangeChannel(VoiceChannel.Guild);
                }
            });
        }
        #endregion
        #endregion
    }


    public interface IGuildVoiceSetting
    {
        
        //语音模式
        bool VoiceModel { get; set; }
        //Mc状态
        bool McIsMute { get; set; }
        //Mc权限
        bool McPermisson { get; set; }
        
        //召集的CD文本
        string TogetherCDText { get; }
        //全部静音的CD文本
        string AllMuteCDText { get; }

        //是否可以点击召集
        bool EnableCallTogether { get; }
        
        //是否可以点击全体静音
        bool EnableAllMute { get; }

        //是否可以改变帮会及时语音模式
        bool EnableChangeVoiceModel { get;  }

        //是否可以上麦
        bool EnableChangeMcPermisson { get;  }



        //方法:
        //请求集合
        void ReqCallTogether();
        //全体静音的消息
        void ReqSetAllUserMute();
    }

}