using SQLite;

namespace ServiceLib.Models
{
    [Serializable]
    public class ProfileItem
    {
        public ProfileItem()
        {
            IndexId = string.Empty;
            ConfigType = EConfigType.VMess;
            ConfigVersion = 2;
            Address = string.Empty;
            Port = 0;
            Id = string.Empty;
            AlterId = 0;
            Security = string.Empty;
            Network = string.Empty;
            Remarks = string.Empty;
            HeaderType = string.Empty;
            RequestHost = string.Empty;
            Path = string.Empty;
            StreamSecurity = string.Empty;
            AllowInsecure = string.Empty;
            Subid = string.Empty;
            Flow = string.Empty;
        }

        #region function

        public string GetSummary()
        {
            var summary = $"[{(ConfigType).ToString()}] ";
            var arrAddr = Address.Split('.');
            var addr = arrAddr.Length switch
            {
                > 2 => $"{arrAddr.First()}***{arrAddr.Last()}",
                > 1 => $"***{arrAddr.Last()}",
                _ => Address
            };
            summary += ConfigType switch
            {
                EConfigType.Custom => $"[{CoreType.ToString()}]{Remarks}",
                _ => $"{Remarks}({addr}:{Port})"
            };
            return summary;
        }

        public List<string>? GetAlpn()
        {
            return Utils.IsNullOrEmpty(Alpn) ? null : Utils.String2List(Alpn);
        }

        public string GetNetwork()
        {
            if (Utils.IsNullOrEmpty(Network) || !Global.Networks.Contains(Network))
            {
                return Global.DefaultNetwork;
            }
            return Network.TrimEx();
        }

        #endregion function

        [PrimaryKey]
        public string IndexId { get; set; }

        public EConfigType ConfigType { get; set; }
        public int ConfigVersion { get; set; }
        public string Address { get; set; }
        public int Port { get; set; }
        public string Id { get; set; }
        public int AlterId { get; set; }
        public string Security { get; set; }
        public string Network { get; set; }
        public string Remarks { get; set; }
        public string HeaderType { get; set; }
        public string RequestHost { get; set; }
        public string Path { get; set; }
        public string StreamSecurity { get; set; }
        public string AllowInsecure { get; set; }
        public string Subid { get; set; }
        public bool IsSub { get; set; } = true;
        public string Flow { get; set; }
        public string Sni { get; set; }
        public string Alpn { get; set; } = string.Empty;
        public ECoreType? CoreType { get; set; }
        public int? PreSocksPort { get; set; }
        public string Fingerprint { get; set; }
        public bool DisplayLog { get; set; } = true;
        public string PublicKey { get; set; }
        public string ShortId { get; set; }
        public string SpiderX { get; set; }
        public string Extra { get; set; }
    }
}