package com.social.media.util;

import com.social.media.domain.entity.Media;
import com.social.media.dto.MediaDto;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class MediaMapper {
    
    /**
     * Converte uma entidade Media para MediaDto
     */
    public MediaDto toDto(Media media) {
        if (media == null) {
            return null;
        }
        
        MediaDto dto = new MediaDto();
        dto.setId(media.getId());
        dto.setMediaCode(media.getMediaCode());
        dto.setCompanyId(media.getCompanyId());
        dto.setUploadedBy(media.getUploadedBy());
        dto.setOriginalFilename(media.getOriginalFilename());
        dto.setStoredFilename(media.getStoredFilename());
        dto.setFilePath(media.getFilePath());
        dto.setFileSize(media.getFileSize());
        dto.setMimeType(media.getMimeType());
        dto.setFormat(media.getFormat());
        dto.setWidth(media.getWidth());
        dto.setHeight(media.getHeight());
        dto.setDurationSeconds(media.getDurationSeconds());
        dto.setIsPublic(media.getIsPublic());
        dto.setDescription(media.getDescription());
        dto.setAltText(media.getAltText());
        dto.setMetadata(media.getMetadata());
        dto.setFileChecksum(media.getFileChecksum());
        dto.setStorageProvider(media.getStorageProvider());
        dto.setValidationStatus(media.getValidationStatus());
        dto.setValidationNotes(media.getValidationNotes());
        dto.setDeletedAt(media.getDeletedAt());
        dto.setUploadedAt(media.getUploadedAt());
        dto.setUpdatedAt(media.getUpdatedAt());
        
        // Set computed fields - these are now calculated in the getters
        dto.setIsImage(media.isImage());
        dto.setIsVideo(media.isVideo());
        dto.setIsAudio(media.isAudio());
        dto.setIsDocument(media.isDocument());
        dto.setIsArchive(media.isArchive());
        dto.setIsDeleted(media.isDeleted());
        dto.setIsApproved(media.isApproved());
        dto.setIsPending(media.isPending());
        dto.setIsRejected(media.isRejected());
        
        return dto;
    }
    
    /**
     * Converte um MediaDto para entidade Media
     */
    public Media toEntity(MediaDto dto) {
        if (dto == null) {
            return null;
        }
        
        Media media = new Media();
        media.setId(dto.getId());
        media.setMediaCode(dto.getMediaCode());
        media.setCompanyId(dto.getCompanyId());
        media.setUploadedBy(dto.getUploadedBy());
        media.setOriginalFilename(dto.getOriginalFilename());
        media.setStoredFilename(dto.getStoredFilename());
        media.setFilePath(dto.getFilePath());
        media.setFileSize(dto.getFileSize());
        media.setMimeType(dto.getMimeType());
        media.setFormat(dto.getFormat());
        media.setWidth(dto.getWidth());
        media.setHeight(dto.getHeight());
        media.setDurationSeconds(dto.getDurationSeconds());
        media.setIsPublic(dto.getIsPublic());
        media.setDescription(dto.getDescription());
        media.setAltText(dto.getAltText());
        media.setMetadata(dto.getMetadata());
        media.setFileChecksum(dto.getFileChecksum());
        media.setStorageProvider(dto.getStorageProvider());
        media.setValidationStatus(dto.getValidationStatus());
        media.setValidationNotes(dto.getValidationNotes());
        media.setDeletedAt(dto.getDeletedAt());
        media.setUploadedAt(dto.getUploadedAt());
        media.setUpdatedAt(dto.getUpdatedAt());
        
        return media;
    }
    
    /**
     * Converte uma lista de entidades Media para lista de MediaDto
     */
    public List<MediaDto> toDtoList(List<Media> mediaList) {
        if (mediaList == null) {
            return null;
        }
        
        return mediaList.stream()
                .map(this::toDto)
                .collect(Collectors.toList());
    }
    
    /**
     * Converte uma lista de MediaDto para lista de entidades Media
     */
    public List<Media> toEntityList(List<MediaDto> dtoList) {
        if (dtoList == null) {
            return null;
        }
        
        return dtoList.stream()
                .map(this::toEntity)
                .collect(Collectors.toList());
    }
    
    /**
     * Atualiza uma entidade Media existente com dados do MediaDto
     * (usado para operações de update)
     */
    public Media updateEntity(Media existingMedia, MediaDto dto) {
        if (existingMedia == null || dto == null) {
            return existingMedia;
        }
        
        // Update only allowed fields (some fields should not be updated)
        if (dto.getDescription() != null) {
            existingMedia.setDescription(dto.getDescription());
        }
        if (dto.getAltText() != null) {
            existingMedia.setAltText(dto.getAltText());
        }
        if (dto.getIsPublic() != null) {
            existingMedia.setIsPublic(dto.getIsPublic());
        }
        if (dto.getMetadata() != null) {
            existingMedia.setMetadata(dto.getMetadata());
        }
        if (dto.getValidationStatus() != null) {
            existingMedia.setValidationStatus(dto.getValidationStatus());
        }
        if (dto.getValidationNotes() != null) {
            existingMedia.setValidationNotes(dto.getValidationNotes());
        }
        if (dto.getWidth() != null) {
            existingMedia.setWidth(dto.getWidth());
        }
        if (dto.getHeight() != null) {
            existingMedia.setHeight(dto.getHeight());
        }
        if (dto.getDurationSeconds() != null) {
            existingMedia.setDurationSeconds(dto.getDurationSeconds());
        }
        
        return existingMedia;
    }
    
    /**
     * Cria um MediaDto básico para resposta de upload
     */
    public MediaDto toBasicDto(Media media) {
        if (media == null) {
            return null;
        }
        
        MediaDto dto = new MediaDto();
        dto.setId(media.getId());
        dto.setMediaCode(media.getMediaCode());
        dto.setOriginalFilename(media.getOriginalFilename());
        dto.setStoredFilename(media.getStoredFilename());
        dto.setFileSize(media.getFileSize());
        dto.setMimeType(media.getMimeType());
        dto.setFormat(media.getFormat());
        dto.setIsPublic(media.getIsPublic());
        dto.setValidationStatus(media.getValidationStatus());
        dto.setUploadedAt(media.getUploadedAt());
        
        // Set basic computed fields - these are now calculated in the getters
        dto.setIsImage(media.isImage());
        dto.setIsVideo(media.isVideo());
        dto.setIsAudio(media.isAudio());
        dto.setIsDocument(media.isDocument());
        dto.setIsArchive(media.isArchive());
        dto.setIsApproved(media.isApproved());
        dto.setIsPending(media.isPending());
        dto.setIsRejected(media.isRejected());
        
        return dto;
    }
    
    /**
     * Cria um MediaDto com informações estendidas (incluindo dados de usuário e empresa)
     */
    public MediaDto toExtendedDto(Media media, String uploaderName, String uploaderEmail, String companyName) {
        MediaDto dto = toDto(media);
        
        if (dto != null) {
            dto.setUploaderName(uploaderName);
            dto.setUploaderEmail(uploaderEmail);
            dto.setCompanyName(companyName);
        }
        
        return dto;
    }
    
    /**
     * Cria um MediaDto com URLs de acesso
     */
    public MediaDto toDtoWithUrls(Media media, String downloadUrl, String thumbnailUrl, String previewUrl) {
        MediaDto dto = toDto(media);
        
        if (dto != null) {
            dto.setDownloadUrl(downloadUrl);
            dto.setThumbnailUrl(thumbnailUrl);
            dto.setPreviewUrl(previewUrl);
        }
        
        return dto;
    }
}
