using System;
using Telegram.Bot;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;

namespace Monithor.api {
	public class Alerting {
		public class TelegramTarget {
			public TelegramTarget(TelegramBotClient client, string chatId, IMonitor monitor, string statusPageRoute, string displayName) {
				_client          = client;
				_chatId          = chatId;
				Monitor          = monitor;
				_statusPageRoute = statusPageRoute;
				_displayName     = displayName;
			}

			private readonly TelegramBotClient _client;
			private readonly string            _chatId;
			public readonly  IMonitor          Monitor;
			private readonly string            _statusPageRoute;
			private readonly string            _displayName;

			public async void SendMessage() {
				var statusPageBtn = new InlineKeyboardMarkup(InlineKeyboardButton.WithUrl("Open status page", $"https://{_statusPageRoute}"));
				var message       = GetMessage(Monitor, _displayName);
				try {
					await _client.SendTextMessageAsync(_chatId, message, ParseMode.Default, replyMarkup: statusPageBtn);
				}
				catch (Exception e) {
					Console.WriteLine(e);
				}
			}
		}

		private static string GetMessage(IMonitor mon, string displayName) {
			return mon.Status switch {
				MonitorStatus.Up => $"🟢 {displayName} is UP.\n" + $"Outage duration: {mon.ResolvedAt.Subtract(mon.StartedAt).ToStringCustom()}",

				MonitorStatus.Recovering => $"🟡 {displayName} is recovering.",
				MonitorStatus.Down       => $"🔴 {displayName} is DOWN.\n" + $"Cause: {mon.LastValue}\n" + $"Outage started {mon.StartedAt:yyyy'-'MM'-'dd HH':'mm':'ss %K}",
				MonitorStatus.Unknown    => null,
				MonitorStatus.Validating => null,
				_                        => null
			};
		}
	}

	public static class TimeSpanExtensions {
		public static string ToStringCustom(this TimeSpan timeSpan) {
			var retstr = $"{timeSpan.Seconds}s";
			if (timeSpan.Minutes > 0)
				retstr = $"{timeSpan.Minutes}m {retstr}";
			if (Math.Floor(timeSpan.TotalHours) > 0)
				retstr = $"{Math.Floor(timeSpan.TotalHours)}h {retstr}";

			return retstr;
		}
	}
}