using System.Net;
using System.Text.Json;
using System.Threading.Tasks;
using DHT.Server.Data;
using DHT.Server.Database;
using DHT.Server.Service;
using DHT.Utils.Http;
using Microsoft.AspNetCore.Http;

namespace DHT.Server.Endpoints {
	sealed class TrackChannelEndpoint : BaseEndpoint {
		public TrackChannelEndpoint(IDatabaseFile db, ServerParameters parameters) : base(db, parameters) {}

		protected override async Task<(HttpStatusCode, object?)> Respond(HttpContext ctx) {
			var root = await ReadJson(ctx);
			var server = ReadServer(root.RequireObject("server"), "server");
			var channel = ReadChannel(root.RequireObject("channel"), "channel", server.Id);

			Db.AddServer(server);
			Db.AddChannel(channel);

			return (HttpStatusCode.OK, null);
		}

		private static Data.Server ReadServer(JsonElement json, string path) => new() {
			Id = json.RequireSnowflake("id", path),
			Name = json.RequireString("name", path),
			Type = ServerTypes.FromString(json.RequireString("type", path)) ?? throw new HttpException(HttpStatusCode.BadRequest, "Server type must be either 'SERVER', 'GROUP', or 'DM'.")
		};

		private static Channel ReadChannel(JsonElement json, string path, ulong serverId) => new() {
			Id = json.RequireSnowflake("id", path),
			Server = serverId,
			Name = json.RequireString("name", path),
			ParentId = json.HasKey("parent") ? json.RequireSnowflake("parent", path) : null,
			Position = json.HasKey("position") ? json.RequireInt("position", path, min: 0) : null,
			Topic = json.HasKey("topic") ? json.RequireString("topic", path) : null,
			Nsfw = json.HasKey("nsfw") ? json.RequireBool("nsfw", path) : null
		};
	}
}