using Marco.Pms.Model.DocumentManager;
using Marco.Pms.Model.Dtos.Forum;
using Marco.Pms.Model.Dtos.Master;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Forum;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.ViewModels.Forum;

namespace Marco.Pms.Model.Mapper
{
    public static class ForumMapper
    {
        public static TicketForum ToTicketForumFromCreateTicketDto(this CreateTicketDto createTicketDto, Guid tenantId)
        {
            return new TicketForum
            {
                Subject = createTicketDto.Subject,
                Description = createTicketDto.Description,
                StatusId = createTicketDto.StatusId,
                TypeId = createTicketDto.TypeId,
                CreatedById = createTicketDto.CreatedById,
                CreatedAt = createTicketDto.CreatedAt,
                LinkedProjectId = createTicketDto.LinkedProjectId,
                LinkedActivityId = createTicketDto.LinkedActivityId,
                PriorityId = createTicketDto.PriorityId,
                TenantId = tenantId,
            };
        }
        public static TicketForum ToTicketForumFromUpdateTicketDto(this UpdateTicketDto updateTicketDto, TicketForum ticket)
        {
            return new TicketForum
            {
                Id = updateTicketDto.Id,
                Subject = updateTicketDto.Subject,
                Description = updateTicketDto.Description,
                StatusId = updateTicketDto.StatusId,
                TypeId = updateTicketDto.TypeId,
                CreatedById = ticket.CreatedById,
                CreatedAt = ticket.CreatedAt,
                LinkedProjectId = ticket.LinkedProjectId,
                LinkedActivityId = ticket.LinkedActivityId,
                PriorityId = updateTicketDto.PriorityId,
                TenantId = ticket.TenantId
            };
        }

        public static TicketComment ToTicketCommentFromAddCommentDto(this AddCommentDto commentDto, Guid tenantId)
        {
            return new TicketComment
            {
                TicketId = commentDto.TicketId,
                AuthorId = commentDto.AuthorId,
                MessageText = commentDto.MessageText,
                SentAt = commentDto.SentAt,
                ParentMessageId = commentDto.ParentMessageId,
                TenantId = tenantId,
            };
        }
        public static TicketComment ToTicketCommentFromUpdateCommentDto(this UpdateCommentDto updateComment, Guid tenantId, TicketComment comment)
        {
            return new TicketComment
            {
                Id = updateComment.Id,
                TicketId = updateComment.TicketId,
                AuthorId = comment.AuthorId,
                MessageText = updateComment.MessageText,
                SentAt = comment.SentAt,
                ParentMessageId = updateComment.ParentMessageId,
                TenantId = tenantId,
            };
        }
        public static TicketAttachment ToTicketAttachmentFromForumAttachmentDto(this ForumAttachmentDto AttachmentDto, Guid ticketId, Guid fileId, Guid? commentId = null)
        {
            return new TicketAttachment
            {
                TicketId = ticketId,
                CommentId = commentId,
                FileName = AttachmentDto.FileName,
                FileId = fileId,
            };
        }
        public static TicketAttachment ToTicketAttachmentFromUpdateAttachmentDto(this UpdateAttachmentDto AttachmentDto, Guid ticketId, Guid fileId, Guid? commentId = null)
        {
            return new TicketAttachment
            {
                TicketId = ticketId,
                CommentId = commentId,
                FileName = AttachmentDto.FileName,
                FileId = fileId,
            };
        }

        public static Document ToDocumentFromForumAttachmentDto(this ForumAttachmentDto AttachmentDto, string objectKey, string thumbS3Key, DateTime uploadedAt,
            Guid tenantId, Guid batchId, Guid loggedInEmployeeId)
        {
            return new Document
            {
                BatchId = batchId,
                UploadedById = loggedInEmployeeId,
                FileName = AttachmentDto.FileName,
                ContentType = AttachmentDto.ContentType,
                S3Key = objectKey,
                ThumbS3Key = thumbS3Key,
                //Base64Data = AttachmentDto.Base64Data,
                FileSize = AttachmentDto.FileSize,
                UploadedAt = uploadedAt,
                TenantId = tenantId
            };
        }
        public static Document ToDocumentFromUpdateAttachmentDto(this UpdateAttachmentDto AttachmentDto, string objectKey, string thumbS3Key, DateTime uploadedAt,
            Guid tenantId, Guid batchId, Guid loggedInEmployeeId)
        {
            return new Document
            {
                BatchId = batchId,
                UploadedById = loggedInEmployeeId,
                FileName = AttachmentDto.FileName,
                ContentType = AttachmentDto.ContentType,
                S3Key = objectKey,
                ThumbS3Key = thumbS3Key,
                //Base64Data = AttachmentDto.Base64Data,
                FileSize = AttachmentDto.FileSize,
                UploadedAt = uploadedAt,
                TenantId = tenantId
            };
        }
        public static ForumTicketVM ToForumTicketVMFromTicketForum(this TicketForum ticket, Employee employee)
        {
            return new ForumTicketVM
            {
                Id = ticket.Id,
                Subject = ticket.Subject,
                Description = ticket.Description,
                CreatedAt = ticket.CreatedAt,
                LinkedProjectId = ticket.LinkedProjectId,
                LinkedActivityId = ticket.LinkedActivityId,
                Status = ticket.TicketStatusMaster != null ? ticket.TicketStatusMaster.ToTicketStatusVMFromTicketStatusMaster() : new TicketStatusVM(),
                Priority = ticket.Priority != null ? ticket.Priority.ToTicketPriorityVMFromTicketPriorityMaster() : new TicketPriorityVM(),
                Type = ticket.TicketTypeMaster != null ? ticket.TicketTypeMaster.ToTicketTypeVMFromTicketTypeMaster() : new TicketTypeVM(),
                CreatedBy = employee.ToBasicEmployeeVMFromEmployee(),
            };
        }
        public static TicketAttachmentVM ToTicketAttachmentVMFromTicketAttachment(this TicketAttachment attachment, string preSignedUrl, string thumbPreSignedUrl)
        {
            return new TicketAttachmentVM
            {
                Id = attachment.Id,
                TicketId = attachment.TicketId,
                CommentId = attachment.CommentId,
                FileName = attachment.FileName,
                PreSignedUrl = preSignedUrl,
                ThumbPreSignedUrl = thumbPreSignedUrl
            };
        }
        public static TicketCommentVM ToTicketCommentVMFromTicketComment(this TicketComment comment, Employee employee)
        {
            return new TicketCommentVM
            {
                Id = comment.Id,
                TicketId = comment.TicketId,
                Author = employee.ToBasicEmployeeVMFromEmployee(),
                MessageText = comment.MessageText,
                SentAt = comment.SentAt,
                ParentMessageId = comment.ParentMessageId,
                Attachments = new List<TicketAttachmentVM>()
            };
        }
        public static TicketStatusVM ToTicketStatusVMFromTicketStatusMaster(this TicketStatusMaster statusMaster)
        {
            return new TicketStatusVM
            {
                Id = statusMaster.Id,
                Name = statusMaster.Name,
                Description = statusMaster.Description,
                ColorCode = statusMaster.ColorCode,
                IsDefault = statusMaster.IsDefault
            };
        }
        public static TicketStatusMaster ToTicketStatusMasterFromTicketStatusMasterDto(this TicketStatusMasterDto statusMasterDto, Guid tenantId)
        {
            return new TicketStatusMaster
            {
                Id = statusMasterDto.Id != null ? statusMasterDto.Id.Value : Guid.Empty,
                Name = statusMasterDto.Name,
                Description = statusMasterDto.Description,
                ColorCode = statusMasterDto.ColorCode,
                IsDefault = statusMasterDto.IsDefault,
                TenantId = tenantId

            };
        }
        public static TicketPriorityVM ToTicketPriorityVMFromTicketPriorityMaster(this TicketPriorityMaster priorityMaster)
        {
            return new TicketPriorityVM
            {
                Id = priorityMaster.Id,
                Name = priorityMaster.Name,
                Level = priorityMaster.Level,
                ColorCode = priorityMaster.ColorCode,
                IsDefault = priorityMaster.IsDefault
            };
        }
        public static TicketPriorityMaster ToTicketPriorityMasterFromTicketPriorityMasterDto(this TicketPriorityMasterDto priorityMasterDto, Guid tenantId)
        {
            return new TicketPriorityMaster
            {
                Id = priorityMasterDto.Id != null ? priorityMasterDto.Id.Value : Guid.Empty,
                Name = priorityMasterDto.Name,
                Level = priorityMasterDto.Level,
                ColorCode = priorityMasterDto.ColorCode,
                IsDefault = priorityMasterDto.IsDefault,
                TenantId = tenantId
            };
        }
        public static TicketTypeVM ToTicketTypeVMFromTicketTypeMaster(this TicketTypeMaster typeMaster)
        {
            return new TicketTypeVM
            {
                Id = typeMaster.Id,
                Name = typeMaster.Name,
                Description = typeMaster.Description,
                IsDefault = typeMaster.IsDefault
            };
        }
        public static TicketTypeMaster ToTicketTypeMasterFromTicketTypeMasterDto(this TicketTypeMasterDto typeMasterDto, Guid tenantId)
        {
            return new TicketTypeMaster
            {
                Id = typeMasterDto.Id != null ? typeMasterDto.Id.Value : Guid.Empty,
                Name = typeMasterDto.Name,
                Description = typeMasterDto.Description,
                IsDefault = typeMasterDto.IsDefault,
                TenantId = tenantId
            };
        }
        public static TicketTagVM ToTicketTagVMFromTicketTagMaster(this TicketTagMaster tagMaster)
        {
            return new TicketTagVM
            {
                Id = tagMaster.Id,
                Name = tagMaster.Name,
                ColorCode = tagMaster.ColorCode,
                IsDefault = tagMaster.IsDefault
            };
        }
        public static TicketTagMaster ToTicketTagMasterFromTicketTagMasterDto(this TicketTagMasterDto tagMasterDto, Guid tenantId)
        {
            return new TicketTagMaster
            {
                Id = tagMasterDto.Id != null ? tagMasterDto.Id.Value : Guid.Empty,
                Name = tagMasterDto.Name,
                ColorCode = tagMasterDto.ColorCode,
                IsDefault = tagMasterDto.IsDefault,
                TenantId = tenantId
            };
        }
    }
}
