package com.infoclinika.pdx.projection;

import java.util.List;

/**
 * Projection for clustered data summary.
 */
public class ClusteredDataSummary {
    private final List<ClusterNode> columnCluster;
    private final List<ClusterNode> rowCluster;
    private final List<SampleDto> columns;
    private final List<IdAndNameDto> rows;
    private final List<ItemWithEntityRecords> values;

    private ClusteredDataSummary(ClusteredDataSummaryBuilder builder) {
        this.columnCluster = builder.columnCluster;
        this.rowCluster = builder.rowCluster;
        this.columns = builder.columns;
        this.rows = builder.rows;
        this.values = builder.values;
    }

    public List<ClusterNode> getColumnCluster() {
        return columnCluster;
    }

    public List<ClusterNode> getRowCluster() {
        return rowCluster;
    }

    public List<SampleDto> getColumns() {
        return columns;
    }

    public List<IdAndNameDto> getRows() {
        return rows;
    }

    public List<ItemWithEntityRecords> getValues() {
        return values;
    }

    public static ClusteredDataSummaryBuilder builder() {
        return new ClusteredDataSummaryBuilder();
    }

    /**
     * Builder for {@link ClusteredDataSummary}.
     */
    public static final class ClusteredDataSummaryBuilder {
        private List<ClusterNode> columnCluster;
        private List<ClusterNode> rowCluster;
        private List<SampleDto> columns;
        private List<IdAndNameDto> rows;
        private List<ItemWithEntityRecords> values;

        private ClusteredDataSummaryBuilder() {
        }

        public ClusteredDataSummaryBuilder setColumnCluster(List<ClusterNode> columnCluster) {
            this.columnCluster = columnCluster;
            return this;
        }

        public ClusteredDataSummaryBuilder setRowCluster(List<ClusterNode> rowCluster) {
            this.rowCluster = rowCluster;
            return this;
        }

        public ClusteredDataSummaryBuilder setColumns(List<SampleDto> columns) {
            this.columns = columns;
            return this;
        }

        public ClusteredDataSummaryBuilder setRows(List<IdAndNameDto> rows) {
            this.rows = rows;
            return this;
        }

        public ClusteredDataSummaryBuilder setValues(List<ItemWithEntityRecords> values) {
            this.values = values;
            return this;
        }

        public ClusteredDataSummary build() {
            return new ClusteredDataSummary(this);
        }
    }

    @Override
    public String toString() {
        return "ClusteredDataSummary{"
               + "columnCluster=" + columnCluster
               + ", rowCluster=" + rowCluster
               + ", columns=" + columns
               + ", rows=" + rows
               + ", values=" + values
               + '}';
    }
}
