using Common.Dtos.Conversation;
using Common.Enums;
using System.Net.Http.Json;

namespace HushianWebApp.Service
{
    public class ChatService
    {
        private readonly BaseController _baseController;
        const string BaseRoute = "v1/Chat/";

        public ChatService(BaseController baseController)
        {
            _baseController = baseController;
        }

        //Inbox1
        public async Task<List<ChatItemDto>> ChatAwaitingOurResponse()
        {
            var response = await _baseController.Get($"{BaseRoute}ChatsAwaitingOurResponse");
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadFromJsonAsync<List<ChatItemDto>>();

            return new();
        }
        //Inbox2
        public async Task<List<ChatItemDto>> MyChatsIsInProgress()
        {
            var response = await _baseController.Post($"{BaseRoute}MyChats", ConversationStatus.InProgress);
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadFromJsonAsync<List<ChatItemDto>>();

            return new();
        }
        //Inbox3
        public async Task<List<ChatItemDto>> MyChatsIsFinished()
        {
            var response = await _baseController.Post($"{BaseRoute}MyChats", ConversationStatus.Finished);
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadFromJsonAsync<List<ChatItemDto>>();

            return new();
        }
        public async Task<ChatItemDto> NewChatFromCurrentUser(ADD_ConversationDto conversation)
        {
            var response = await _baseController.Post($"{BaseRoute}NewChatFromCurrentUser", conversation);
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadFromJsonAsync<ChatItemDto>();

            return null;
        }
        public async Task<ChatItemResponseDto?> ADDChatResponse(int ConversationID, string text, ConversationType type)
        {
            var response = await _baseController.Post($"{BaseRoute}ADDChatResponse", new ADD_ConversationResponseDto()
            {
                ConversationID = ConversationID,
                Text = text,
                Type = type
            });
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadFromJsonAsync<ChatItemResponseDto>();
            return null;

        }

        // Send chat response with optional file attachment (e.g., image)
        public async Task<ChatItemResponseDto?> ADDChatResponse(int conversationID, string text, ConversationType type,
            string? fileName, string? fileType, byte[]? fileContent)
        {
            if (text == null) text = "";
            var response = await _baseController.Post($"{BaseRoute}ADDChatResponse", new ADD_ConversationResponseDto()
            {
                ConversationID = conversationID,
                Text = text,
                Type = type,
                FileName = fileName,
                FileType = fileType,
                FileContent = fileContent
            });
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadFromJsonAsync<ChatItemResponseDto>();
            return null;
        }

        public async Task<bool> OpenChat(int ChatID)
        {
            var response = await _baseController.Put($"{BaseRoute}OpenChat/{ChatID}");
            return response.IsSuccessStatusCode;
        }
        public async Task<bool> ChatIsFinish(int ChatID)
        {
            var response = await _baseController.Put($"{BaseRoute}ChatIsFinish/{ChatID}");
            return response.IsSuccessStatusCode;
        }
        public async Task<bool> Attachedto(int toExperID, int ChatID)
        {
            var response = await _baseController.Put($"{BaseRoute}Attached-to/{toExperID}/{ChatID}");
            return response.IsSuccessStatusCode;
        }
        public async Task<bool> ChatIsFinishFromUser(int ChatID)
        {
            var response = await _baseController.Put($"{BaseRoute}ChatIsFinishFromUser/{ChatID}");
            return response.IsSuccessStatusCode;
        }

        public async Task<bool> MarkAsReadChatItemAsync(int ID)
        {
            var response = await _baseController.Put($"{BaseRoute}MarkAsReadChatItem/{ID}");
            return response.IsSuccessStatusCode;

        }
        public async Task<ChatItemDto?> GetLastOpenChatInCompany(int CompanyID)
        {
            var response = await _baseController.Get($"{BaseRoute}User/LastOpenChatInCompany/{CompanyID}");
            if (response.StatusCode==System.Net.HttpStatusCode.OK)
                return await response.Content.ReadFromJsonAsync<ChatItemDto?>();

            return null;
        }
        public async Task<(int,int)?> GetLastChat()
        {
            var response = await _baseController.Get($"{BaseRoute}User/LastChat");
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
                return await response.Content.ReadFromJsonAsync<(int, int)?>();

            return null;
        }
        public async Task<ChatItemDto?> Getchat(int  ChatID)
        {
            var response = await _baseController.Get($"{BaseRoute}User/Chat/{ChatID}");
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
                return await response.Content.ReadFromJsonAsync<ChatItemDto>();

            return null;
        }
    }
}
