Code/Connector/Data/WebcastMessages/WebcastChatMessage.cs
namespace Minima.TikTokLive;

/// Thanks to the awesome people at TikTok-Live-Connector
/// https://github.com/zerodytrash/TikTok-Live-Connector/blob/ecde03a3113b45c30e9d43b6a686ef6b40d297e2/.proto/tiktok-schema.ts

/// <summary>
///	Represents a chat message in the room.
/// </summary>
public class WebcastChatMessage : BaseWebcastMessage {
	public WebcastChatMessageEvent? Event { get; set; }
	public User? User { get; set; }
	public string Comment { get; set; }
	public bool VisibleToSender { get; set; }
	public WebcastChatMessageImageModel? Background { get; set; }
	public string FullScreenTextColor { get; set; }
	public WebcastChatMessageImageModel? BackgroundImageV2 { get; set; }
	public WebcastChatMessageImageModel? GiftImage { get; set; }
	public int InputType { get; set; }
	public User? AtUser { get; set; }
	public WebcastSubEmote[] Emotes { get; set; }
	public string ContentLanguage { get; set; }
	public int QuickChatScene { get; set; }
	public int CommunityflaggedStatus { get; set; }
	public WebcastChatMessageCommentQualityScore[] CommentQualityScores { get; set; }
	public WebcastChatMessageUserIdentity? UserIdentity { get; set; }
	public WebcastChatMessageCommentTag[] CommentTag { get; set; }
	public string ScreenTime { get; set; }
	public string Signature { get; set; }
	public string SignatureVersion { get; set; }
	public string EcStreamerKey { get; set; }

	public override void Handle( TikTokLiveConnector tikTokLiveConnector ) =>
		ITikTokLiveEvents.Post( ttle => ttle.OnChat( this ) );

	public struct WebcastChatMessageEvent {
		public string MsgId { get; set; }
		public string CreateTime { get; set; }
		public WebcastChatMessageEventDetails? EventDetails { get; set; }

		public struct WebcastChatMessageEventDetails {
			public string DisplayType { get; set; }
			public string Label { get; set; }
		}
	}

	public struct WebcastChatMessageImageModel {
		public string[] MUrls { get; set; }
		public string MUri { get; set; }
		public int Height { get; set; }
		public int Width { get; set; }
		public string AvgColor { get; set; }
		public int ImageType { get; set; }
		public string Schema { get; set; }
		public WebcastChatMessageImageModelContent? Content { get; set; }
		public bool IsAnimated { get; set; }

		public struct WebcastChatMessageImageModelContent {
			public string Name { get; set; }
			public string FontColor { get; set; }
			public string Level { get; set; }
		}
	}

	public struct WebcastSubEmote {
		public int PlaceInComment { get; set; }
		public WebcastSubEmoteDetails? Emote { get; set; }

		public struct WebcastSubEmoteDetails {
			public string EmoteId { get; set; }
			public WebcastSubEmoteImage? Image { get; set; }

			public struct WebcastSubEmoteImage {
				public string ImageUrl { get; set; }
			}
		}
	}

	public struct WebcastChatMessageCommentQualityScore {
		public string Version { get; set; }
		public string Score { get; set; }
	}

	public struct WebcastChatMessageUserIdentity {
		public bool IsGiftGiverOfAnchor { get; set; }
		public bool IsSubscriberOfAnchor { get; set; }
		public bool IsMutualFollowingWithAnchor { get; set; }
		public bool IsFollowerOfAnchor { get; set; }
		public bool IsModeratorOfAnchor { get; set; }
		public bool IsAnchor { get; set; }
	}

	// Use enum for tags
	public enum WebcastChatMessageCommentTag {
		CommentTagNormal = 0,
		CommentTagCandidate = 1,
		CommentTagOverage = 2,
		Unrecognized = -1
	}
}