/**********************************************************************
 * Copyright (c) 2017, 2020 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/

package org.eclipse.tracecompass.tmf.core.model.timegraph;

import java.util.Collections;
import java.util.List;

import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

/**
 * Implementation of {@link ITimeGraphEntryModel}.
 *
 * @author Simon Delisle
 * @since 4.0
 */
public class TimeGraphEntryModel extends TmfTreeDataModel implements ITimeGraphEntryModel {
    private final long fStartTime;
    private final long fEndTime;
    private final boolean fHasRowModel;
    private Multimap<String, Object> fMetaData = HashMultimap.create();

    /**
     * Constructor
     *
     * @param id
     *            Entry ID
     * @param parentId
     *            Parent ID
     * @param name
     *            Entry name to be displayed
     * @param startTime
     *            Start time
     * @param endTime
     *            End time
     */
    public TimeGraphEntryModel(long id, long parentId, String name, long startTime, long endTime) {
        this(id, parentId, Collections.singletonList(name), startTime, endTime, true);
    }

    /**
     * Constructor
     *
     * @param id
     *            Entry ID
     * @param parentId
     *            Parent ID
     * @param name
     *            Entry name to be displayed
     * @param startTime
     *            Start time
     * @param endTime
     *            End time
     * @param hasRowModel
     *            true if the entry has a row model
     */
    public TimeGraphEntryModel(long id, long parentId, String name, long startTime, long endTime, boolean hasRowModel) {
        this(id, parentId, Collections.singletonList(name), startTime, endTime, hasRowModel);
    }

    /**
     * Constructor
     *
     * @param id
     *            Entry ID
     * @param parentId
     *            Parent ID
     * @param labels
     *            Entry labels to be displayed
     * @param startTime
     *            Start time
     * @param endTime
     *            End time
     * @since 5.0
     */
    public TimeGraphEntryModel(long id, long parentId, List<String> labels, long startTime, long endTime) {
        this(id, parentId, labels, startTime, endTime, true);
    }

    /**
     * Constructor
     *
     * @param id
     *            Entry ID
     * @param parentId
     *            Parent ID
     * @param labels
     *            Entry labels to be displayed
     * @param startTime
     *            Start time
     * @param endTime
     *            End time
     * @param hasRowModel
     *            true if the entry has a row model
     * @since 5.0
     */
    public TimeGraphEntryModel(long id, long parentId, List<String> labels, long startTime, long endTime, boolean hasRowModel) {
        super(id, parentId, labels);
        fStartTime = startTime;
        fEndTime = endTime;
        fHasRowModel = hasRowModel;
    }

    @Override
    public long getStartTime() {
        return fStartTime;
    }

    @Override
    public long getEndTime() {
        return fEndTime;
    }

    @Override
    public boolean hasRowModel() {
        return fHasRowModel;
    }

    @Override
    public Multimap<String, Object> getMetadata() {
        return fMetaData;
    }

    @Override
    public String toString() {
        return String.format("Entry Model: id:%d, parentId:%d, labels:%s, startTime:%d, endTime:%d, hasRowModel:%b", getId(), getParentId(), getLabels(), fStartTime, fEndTime, fHasRowModel); //$NON-NLS-1$
    }
}
