package eu.eudat.models.data.dashboard.recent.model;

import eu.eudat.data.entities.DMP;
import eu.eudat.logic.utilities.helpers.LabelBuilder;
import eu.eudat.models.data.dmp.AssociatedProfile;
import eu.eudat.models.data.dmp.Organisation;
import eu.eudat.models.data.listingmodels.UserInfoListingModel;
import eu.eudat.models.data.urls.DatasetUrlListing;

import javax.transaction.Transactional;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

public class RecentDmpModel extends RecentActivityModel<DMP, RecentDmpModel> {
	private String doi;
	private Map<String, Object> extraProperties;
	private List<DatasetUrlListing> datasets;
	private List<AssociatedProfile> associatedProfiles;
	private String organisations;
	private UUID groupId;


	public String getDoi() {
		return doi;
	}

	public void setDoi(String doi) {
		this.doi = doi;
	}

	public Map<String, Object> getExtraProperties() {
		return extraProperties;
	}

	public void setExtraProperties(Map<String, Object> extraProperties) {
		this.extraProperties = extraProperties;
	}

	public List<DatasetUrlListing> getDatasets() {
		return datasets;
	}

	public void setDatasets(List<DatasetUrlListing> datasets) {
		this.datasets = datasets;
	}

	public List<AssociatedProfile> getAssociatedProfiles() {
		return associatedProfiles;
	}

	public void setAssociatedProfiles(List<AssociatedProfile> associatedProfiles) {
		this.associatedProfiles = associatedProfiles;
	}

	public String getOrganisations() {
		return organisations;
	}

	public void setOrganisations(String organisations) {
		this.organisations = organisations;
	}

	public UUID getGroupId() {
		return groupId;
	}

	public void setGroupId(UUID groupId) {
		this.groupId = groupId;
	}

	@Override
	@Transactional
	public RecentActivityModel fromEntity(DMP entity) {
		this.setType(RecentActivityType.DMP.getIndex());
		this.setId(entity.getId().toString());
		this.setTitle(entity.getLabel());
		this.setDescription(entity.getDescription());
		this.setCreated(entity.getCreated());
		this.setModified(entity.getModified());
		this.setStatus(entity.getStatus());
		this.setVersion(entity.getVersion());
		//this.datasets = entity.getDataset().stream().map(dataset -> new RecentDatasetModel().fromDmpEntity(dataset)).collect(Collectors.toList());
		this.datasets = entity.getDataset().stream().map(dataset -> new DatasetUrlListing().fromDataModel(dataset)).collect(Collectors.toList());
		this.associatedProfiles = entity.getAssociatedDmps().stream().map(item -> new AssociatedProfile().fromData(item)).collect(Collectors.toList());
		this.setFinalizedAt(entity.getFinalizedAt());
		this.setGrant(entity.getGrant().getLabel());
		this.setGrantAbbreviation(entity.getGrant().getAbbreviation());
		this.setGrantId(entity.getGrant().getId().toString());
		this.groupId = entity.getGroupId();
		this.setPublic(entity.isPublic());
		this.organisations = LabelBuilder.getLabel(entity.getOrganisations().stream().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList()));
		//if (entity.getProfile() != null) this.setProfile(new DatasetProfileOverviewModel().fromDataModel(entity.getProfile()));
		this.setPublishedAt(entity.getPublishedAt());
		this.setUsers(entity.getUsers().stream().map(x -> new UserInfoListingModel().fromDataModel(x)).collect(Collectors.toList()));
		return this;
	}

	@Override
	public RecentDmpModel fromDataModel(DMP entity) {
		return (RecentDmpModel) this.fromEntity(entity);
	}

	@Override
	public DMP toDataModel() throws Exception {
		return null;
	}

	@Override
	public String getHint() {
		return "recentDmpModel";
	}
}
