package com.infoclinika.pdx.projection;

import com.infoclinika.pdx.domain.dataset.Dataset;
import com.infoclinika.pdx.domain.dataset.DatasetPublicStatus;
import com.infoclinika.pdx.domain.dataset.DatasetStatus;
import com.infoclinika.pdx.domain.sample.SampleType;

import java.sql.Timestamp;
import java.util.Objects;
import java.util.Set;

/**
 * Projection of private {@link Dataset}.
 */
public class DatasetDto {
    private final Long id;
    private final String type;
    private final SampleType model;
    private final DatasetStatus status;
    private final DatasetPublicStatus publicStatus;
    private final Timestamp creationDate;
    private final Set<String> files;

    /**
     * Initializes all fields.
     */
    public DatasetDto(Dataset dataset) {
        this.id = dataset.getId();
        this.type = dataset.getType();
        this.model = dataset.getModel();
        this.status = dataset.getStatus();
        this.publicStatus = dataset.getPublicStatus();
        this.creationDate = dataset.getCreationDate();
        this.files = dataset.getFiles();
    }

    public Long getId() {
        return id;
    }

    public String getType() {
        return type;
    }

    public SampleType getModel() {
        return model;
    }

    public DatasetStatus getStatus() {
        return status;
    }

    public DatasetPublicStatus getPublicStatus() {
        return publicStatus;
    }

    public Timestamp getCreationDate() {
        return creationDate;
    }

    public Set<String> getFiles() {
        return files;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        final DatasetDto that = (DatasetDto) o;
        return Objects.equals(getId(), that.getId())
               && Objects.equals(getType(), that.getType())
               && getModel() == that.getModel()
               && getStatus() == that.getStatus()
               && getPublicStatus() == that.getPublicStatus()
               && Objects.equals(getCreationDate(), that.getCreationDate())
               && Objects.equals(getFiles(), that.getFiles());
    }

    @Override
    public int hashCode() {
        return Objects.hash(
            getId(), getType(), getModel(), getStatus(), getPublicStatus(), getCreationDate(), getFiles()
        );
    }

    @Override
    public String toString() {
        return "DatasetDto{"
               + "id=" + id
               + ", type='" + type + '\''
               + ", model=" + model
               + ", status=" + status
               + ", publicStatus=" + publicStatus
               + ", creationDate=" + creationDate
               + ", files=" + files
               + '}';
    }
}
