using SharpChat.Misuzu;
using System.Text;

namespace SharpChat.Packet {
    public enum AuthFailReason {
        AuthInvalid,
        MaxSessions,
        Banned,
    }

    public class AuthFailPacket : IServerPacket {
        public AuthFailReason Reason { get; private set; }
        public MisuzuBanInfo? BanInfo { get; private set; }

        public AuthFailPacket(AuthFailReason reason, MisuzuBanInfo? fbi = null) {
            Reason = reason;

            if(reason == AuthFailReason.Banned)
                BanInfo = fbi ?? throw new ArgumentNullException(nameof(fbi));
        }

        public IEnumerable<string> Pack() {
            StringBuilder sb = new();

            sb.Append('1');
            sb.Append("\tn\t");

            switch(Reason) {
                case AuthFailReason.AuthInvalid:
                default:
                    sb.Append("authfail");
                    break;
                case AuthFailReason.MaxSessions:
                    sb.Append("sockfail");
                    break;
                case AuthFailReason.Banned:
                    sb.Append("joinfail");
                    break;
            }

            if(Reason == AuthFailReason.Banned) {
                sb.Append('\t');

                if(BanInfo?.IsPermanent == true)
                    sb.Append("-1");
                else
                    sb.Append(BanInfo?.ExpiresAt.ToUnixTimeSeconds() ?? 0);
            }

            yield return sb.ToString();
        }
    }
}