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

namespace JLGames.RocketDriver.Actions.Localx
{
    public static class LocalDomain
    {
        private static DomainManager DefaultManager { get; } = new DomainManager();

        static LocalDomain()
        {
            DefaultManager.Init(LocalKeys.DomainKey, LocalKeys.DomainListKey, LocalKeys.Separator);
        }

        //------------------------------

        /// <summary>
        /// Current domain value
        /// 当前域名值
        /// </summary>
        public static string CurrentDomain => DefaultManager.CurrentDomain;

        /// <summary>
        /// Check if the current domain is not empty
        /// 当前域名是否在线
        /// </summary>
        public static bool DomainOnline => DefaultManager.DomainOnline;

        /// <summary>
        /// Check if the current domain is empty
        /// 当前域名是否离线
        /// </summary>
        public static bool DomainOffline => DefaultManager.DomainOffline;

        /// <summary>
        /// History domain list
        /// 域名列表
        /// </summary>
        public static string[] DomainList => DefaultManager.DomainList;

        /// <summary>
        /// First value of domain list
        /// 列表第一个账号
        /// </summary>
        public static string FirstDomain => DefaultManager.FirstDomain;

        /// <summary>
        /// Size of the domain list
        /// 记录的域名数量
        /// </summary>
        public static int DomainSize => DefaultManager.DomainSize;

        /// <summary>
        /// Check if the domain is in the domain list.
        /// 检查域名是否在列表中
        /// </summary>
        /// <param name="domain"></param>
        /// <returns></returns>
        public static bool CheckDomainInList(string domain)
        {
            return DefaultManager.CheckDomainInList(domain);
        }

        /// <summary>
        /// Set the current domain
        /// 设置当前域名
        /// The new domain will be automatically added to the domain list
        /// 新域名会自动加入到列表中
        /// </summary>
        /// <param name="domain"></param>
        public static bool SetDomain(string domain)
        {
            return DefaultManager.SetDomain(domain);
        }

        /// <summary>
        /// Insert the domain to the top of the domain list
        /// 插入域名到域名列表首位
        /// </summary>
        /// <param name="domain"></param>
        /// <returns>false:domain验证不通过|已经在列表中</returns>
        public static bool InsertDomain(string domain)
        {
            return DefaultManager.InsertDomain(domain);
        }

        /// <summary>
        /// Switch the current domain
        /// 切换当前域名
        /// Prerequisite: domain in the domain list
        /// 前提：域名处理列表中
        /// </summary>
        /// <param name="domain"></param>
        public static bool SwitchDomain(string domain)
        {
            return DefaultManager.SwitchDomain(domain);
        }

        /// <summary>
        /// Clear the value of the current domain
        /// 清除当前域名设置的值
        /// </summary>
        public static void ClearDomain()
        {
            DefaultManager.ClearDomain();
        }

        /// <summary>
        /// Find domain
        /// 查找域名
        /// </summary>
        /// <param name="match"></param>
        /// <returns></returns>
        public static string FindDomain(Predicate<string> match)
        {
            return DefaultManager.FindDomain(match);
        }

        /// <summary>
        /// Add domain to the end of the list
        /// 添加域名到列表尾部
        /// </summary>
        /// <param name="domain"></param>
        public static void AddDomainToList(string domain)
        {
            DefaultManager.AddDomainToList(domain);
        }

        /// <summary>
        /// Add domains to the end of the list
        /// 添加域名到列表
        /// </summary>
        /// <param name="domain"></param>
        public static void AddDomainToList(string[] domain)
        {
            DefaultManager.AddDomainToList(domain);
        }

        /// <summary>
        /// Add domains to the end of the list
        /// 添加域名到列表
        /// </summary>
        /// <param name="domain"></param>
        public static void AddDomainToList(IEnumerable<string> domain)
        {
            DefaultManager.AddDomainToList(domain);
        }

        /// <summary>
        /// Add the domain value to the specified location in the list
        /// 添加域名值到列表中的指定位置
        /// </summary>
        /// <param name="domain"></param>
        /// <param name="index"></param>
        public static void AddDomainToList(string domain, int index)
        {
            DefaultManager.AddDomainToList(domain, index);
        }

        /// <summary>
        /// Add the domains to the specified location in the list
        /// 添加多个域名值到列表中的指定位置
        /// </summary>
        /// <param name="domain"></param>
        /// <param name="index"></param>
        public static void AddDomainToList(string[] domain, int index)
        {
            DefaultManager.AddDomainToList(domain, index);
        }

        /// <summary>
        /// Add the domains to the specified location in the list
        /// 添加多个域名值到列表中的指定位置
        /// </summary>
        /// <param name="domain"></param>
        /// <param name="index"></param>
        public static void AddDomainToList(IEnumerable<string> domain, int index)
        {
            DefaultManager.AddDomainToList(domain, index);
        }

        /// <summary>
        /// Remove a domain from the list
        /// 从列表中删除域名
        /// </summary>
        /// <param name="domain"></param>
        public static void RemoveDomainFromList(string domain)
        {
            DefaultManager.RemoveDomainFromList(domain);
        }

        /// <summary>
        /// Remove domains from the list
        /// 从列表中删除域名
        /// </summary>
        /// <param name="domain"></param>
        public static void RemoveDomainFromList(string[] domain)
        {
            DefaultManager.RemoveDomainFromList(domain);
        }

        /// <summary>
        /// Remove a domains from the list
        /// 从列表中删除域名
        /// </summary>
        /// <param name="domain"></param>
        public static void RemoveDomainFromList(IEnumerable<string> domain)
        {
            DefaultManager.RemoveDomainFromList(domain);
        }

        /// <summary>
        /// Clear the domain list
        /// 清空域名列表
        /// </summary>
        public static void ClearDomainList()
        {
            DefaultManager.ClearDomainList();
        }

        /// <summary>
        /// Save changes
        /// 保存修改
        /// </summary>
        public static void SaveDomainInfo()
        {
            PlayerPrefs.Save();
        }
    }
}