using System.Threading.Tasks;

using Microsoft.AspNetCore.Mvc;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

using NodaTime;

using PluralKit.Core;

namespace PluralKit.API
{
    public struct MessageReturn
    {
        [JsonProperty("timestamp")] public Instant Timestamp;
        [JsonProperty("id")] public string Id;
        [JsonProperty("original")] public string Original;
        [JsonProperty("sender")] public string Sender;
        [JsonProperty("channel")] public string Channel;

        [JsonProperty("system")] public JObject System;
        [JsonProperty("member")] public JObject Member;
    }
    
    [ApiController]
    [ApiVersion("1.0")]
    [Route("msg")]
    [Route( "v{version:apiVersion}/msg" )]
    public class MessageController: ControllerBase
    {
        private IDataStore _data;

        public MessageController(IDataStore _data)
        {
            this._data = _data;
        }

        [HttpGet("{mid}")]
        public async Task<ActionResult<MessageReturn>> GetMessage(ulong mid)
        {
            var msg = await _data.GetMessage(mid);
            if (msg == null) return NotFound("Message not found.");

            return new MessageReturn
            {
                Timestamp = Instant.FromUnixTimeMilliseconds((long) (msg.Message.Mid >> 22) + 1420070400000),
                Id = msg.Message.Mid.ToString(),
                Channel = msg.Message.Channel.ToString(),
                Sender = msg.Message.Sender.ToString(),
                Member = msg.Member.ToJson(User.ContextFor(msg.System)),
                System = msg.System.ToJson(User.ContextFor(msg.System)),
                Original = msg.Message.OriginalMid?.ToString()
            };
        } 
    }
}