package ru.ibs.socrates.confexporter.service.content.mapper;

import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import ru.ibs.socrates.confexporter.api.dto.Project;
import ru.ibs.socrates.confexporter.api.dto.ProjectContent;
import ru.ibs.socrates.confexporter.api.dto.ProjectContentResponse;
import ru.ibs.socrates.confexporter.api.dto.ProjectResponse;
import ru.ibs.socrates.confexporter.dao.dto.ContentDaoDto;
import ru.ibs.socrates.confexporter.dao.dto.ProjectDaoDto;


/**
 * Маппинг для проектов контента.
 */
@Mapper
public interface ProjectMapper {
  
  /**
   * Получение экземпляра ProjectResponse из списка названий проектов.
   * 
   * @param projects список названий проектов
   * @return ProjectResponse с заполненными проектами
   */
  default ProjectResponse toProjectResponse(List<ProjectDaoDto> projects) {
    var response = new ProjectResponse();
    response.setProjects(
        Optional.ofNullable(projects)
            .orElse(List.of())
            .stream()
            .map(this::toProjectResponse)
            .toList());
    return response;
  }
  
  /**
   * Получение экземпляра Project.
   * 
   * @param project
   * @return
   */
  Project toProjectResponse(ProjectDaoDto project);
  
  
  /**
   * Получение экземпляра ProjectContentResponse.
   * 
   * @param projects
   * @return
   */
  default ProjectContentResponse toProjectContentResponse(
      ProjectDaoDto project, List<ContentDaoDto> projects) {
    var response = new ProjectContentResponse();
    response.setProject(toProjectResponse(project));
    response.setContents(
        Optional.ofNullable(projects)
            .orElse(List.of())
            .stream()
            .map(this::toProjectContentResponse)
            .toList());
    return response;
  }
  
  /**
   * Получение экземпляра ProjectContent.
   * 
   * @param project
   * @return
   */
  @Mapping(target = "messageId", source = "externalMessagelId")
  @Mapping(target = "contentType", source = "contentType")
  @Mapping(target = "text", source = "text")
  @Mapping(target = "link", source = "link")
  @Mapping(target = "updated", source = "updated")
  ProjectContent toProjectContentResponse(ContentDaoDto project);
  
}
