using System;
using System.Threading.Tasks;
using SlackAPI;
using System.Linq;

namespace CommonLib
{
    public class SlackPoster : ISlackPoster
    {
        public string SlackToken { get; set; }
        public string UpChannel { get; set; }
        private readonly SlackTaskClient taskClient;

        public SlackPoster()
        {
            SlackToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            UpChannel = "general";
            taskClient = new SlackTaskClient(SlackToken);
        }

        public SlackPoster(string token, string channel)
        {
            SlackToken = token;
            UpChannel = channel;
            taskClient = new SlackTaskClient(SlackToken);
        }

        public string GetToken()
        {
            return SlackToken;
        }

        public string GetChannel()
        {
            return UpChannel;
        }
        public async Task<bool> PostMessageAsync(string message, string upChannel = "")
        {
            if (string.IsNullOrEmpty(upChannel))
            {
                upChannel = UpChannel;
            }
            var response = await taskClient.PostMessageAsync(upChannel, message);
            return response.ok;
        }

        public bool PostMessage(string message, string upChannel = "")
        {
            Task<bool> task = Task.Run<bool>(async () => await PostMessageAsync(message, upChannel));
            return task.Result;
        }

        public bool PostMessage(string[] messages, string upChannel = "")
        {
            bool[] success = new bool[messages.Length];
            for (int i = 0; i < messages.Length; i++)
            {
                Task<bool> task = Task.Run<bool>(async () => await PostMessageAsync(messages[i], upChannel));
                success[i] = task.Result;
            }
            if (success.Contains(false)) return false; else return true;
        }

        public async Task<bool> PostFileAsync(string filepath, string filename, string upChannel = "")
        {
            if (string.IsNullOrEmpty(upChannel))
            {
                upChannel = UpChannel;
            }

            byte[] fileContent = System.IO.File.ReadAllBytes(filepath);

            var response = await taskClient.UploadFileAsync(fileContent, filename, new[] { upChannel });
            return response.ok;
        }

        public bool PostFile(string filepath, string filename, string upChannel = "")
        {
            Task<bool> task = Task.Run<bool>(async () => await PostFileAsync(filepath, filename, upChannel));
            return task.Result;
        }
        public bool PostFile(string[] filepaths, string[] filenames, string upChannel = "")
        {
            if (filepaths.Length != filenames.Length) return false;

            bool[] success = new bool[filepaths.Length];
            for (int i = 0; i < filenames.Length; i++)
            {
                Task<bool> task = Task.Run<bool>(async () => await PostFileAsync(filepaths[i], filenames[i], upChannel));
                success[i] = task.Result;
            }
            if (success.Contains(false)) return false; else return true;
        }
    }
}