package com.social.media.infrastructure.persistence.mapper;

import com.social.media.domain.content.aggregate.Media;
import com.social.media.domain.content.valueobject.MediaId;
import com.social.media.domain.content.valueobject.MediaType;
import com.social.media.domain.company.valueobject.CompanyId;
import com.social.media.domain.user.valueobject.UserId;
import com.social.media.infrastructure.persistence.entity.MediaEntity;
import com.social.media.infrastructure.persistence.entity.MediaTypeEntity;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * Mapper between Media domain object and MediaEntity
 */
@Component
public class MediaEntityMapper {
    
    public MediaEntity toEntity(Media media) {
        if (media == null) {
            return null;
        }
        
        return new MediaEntity(
            media.getId().value(),
            media.getCompanyId().value(),
            media.getUploadedBy().value(),
            media.getOriginalFileName(),
            media.getStoredFileName(),
            media.getFilePath(),
            mapToEntityMediaType(media.getMediaType()),
            media.getFileSizeBytes(),
            media.getMimeType(),
            null, // width - not in Media domain
            null, // height - not in Media domain
            null, // durationSeconds - not in Media domain
            media.isPublic(),
            null, // description - not in Media domain
            media.getAltText(),
            convertMetadataToString(media.getMetadata())
        );
    }
    
    public Media toDomain(MediaEntity entity) {
        if (entity == null) {
            return null;
        }
        
        return new Media(
            new MediaId(entity.getId()),
            new CompanyId(entity.getCompanyId()),
            new UserId(entity.getUploadedBy()),
            entity.getOriginalFileName(),
            entity.getStoredFileName(),
            entity.getMediaType() != null ? mapToDomainMediaType(entity.getMediaType()) : MediaType.IMAGE,
            entity.getMimeType(),
            entity.getFileSize(),
            entity.getFilePath(),
            null, // thumbnailPath - not in entity
            convertStringToMetadata(entity.getMetadata()),
            entity.getAltText(),
            entity.isPublic(),
            entity.getUploadedAt(),
            entity.getUpdatedAt()
        );
    }
    
    private Map<String, String> convertMetadataToString(Map<String, Object> metadata) {
        Map<String, String> result = new HashMap<>();
        if (metadata != null) {
            metadata.forEach((key, value) -> {
                if (value != null) {
                    result.put(key, value.toString());
                }
            });
        }
        return result;
    }
    
    private Map<String, Object> convertStringToMetadata(Map<String, String> metadata) {
        Map<String, Object> result = new HashMap<>();
        if (metadata != null) {
            metadata.forEach((key, value) -> result.put(key, value));
        }
        return result;
    }
    
    private MediaTypeEntity mapToEntityMediaType(MediaType mediaType) {
        return switch (mediaType) {
            case IMAGE -> MediaTypeEntity.IMAGE;
            case VIDEO -> MediaTypeEntity.VIDEO;
            case AUDIO -> MediaTypeEntity.AUDIO;
            case DOCUMENT -> MediaTypeEntity.DOCUMENT;
            case GIF -> MediaTypeEntity.GIF;
        };
    }
    
    private MediaType mapToDomainMediaType(MediaTypeEntity entityType) {
        return switch (entityType) {
            case IMAGE -> MediaType.IMAGE;
            case VIDEO -> MediaType.VIDEO;
            case AUDIO -> MediaType.AUDIO;
            case DOCUMENT -> MediaType.DOCUMENT;
            case GIF -> MediaType.GIF;
        };
    }
}
