package calhoun.gebo.internal.db;

import calhoun.gebo.model.FeatureLink;
import calhoun.gebo.model.Identified;
import calhoun.gebo.model.Track;
import calhoun.gebo.model.VirtualTrack;
import calhoun.gebo.util.Informer;
import calhoun.gebo.util.U;

public class VirtualCalhounTrack extends CalhounTrack implements VirtualTrack {

    private static Informer I = new Informer(VirtualCalhounTrack.class);

    // public VirtualCalhounTrack(CalhounTrack baseTrack, String id)

    // fix these constructors.

    public VirtualCalhounTrack(CalhounTrack baseTrack, String label, String id) {
        this(baseTrack.getTrackType(), baseTrack.getTrackType().getSubclass(),
                baseTrack.getOntologyTerm(), baseTrack.getAnalysisEventId(),
                label, baseTrack.getVersion(), baseTrack.getNotes(), id,
                baseTrack);
        // I.warn("Label: " + label + " Id: " + id);
    }

    private VirtualCalhounTrack(CalhounTrackType trackType, String subclass,
            Identified ontologyTerm, String analysisEventId, String label,
            int version, String notes, String storedId, CalhounTrack baseTrack) {
        super(trackType.getTrackManager(), buildVirtualTrackId(trackType,
                analysisEventId, storedId), label, trackType.getColor(), false,
                false, true, trackType.getSortKey(), buildVirtualTrackId(
                        trackType, analysisEventId, storedId));
        loadPrefs();
        while (baseTrack instanceof VirtualCalhounTrack) {
            baseTrack = (CalhounTrack) ((VirtualCalhounTrack) baseTrack)
                    .getBaseTrack();
        }
        if (baseTrack.getFeatureLink() != null) {
            setFeatureLink(new FeatureLink(this, baseTrack.getFeatureLink()
                    .getTemplate()));
        }
        m_baseTrack = baseTrack;
        m_version = version;
        m_trackType = trackType;
        m_analysisEventId = analysisEventId;
        m_notes = notes;
        // annoying that we need these here as well, but necessary for generic
        // track type.
        m_ontologyTerm = ontologyTerm;
        m_subclass = subclass;
        loadDensityAndComboPrefs();
        setVirtual(true);
        if (storedId == null) {
            // else what we get from prefs is fine.
            setLabel(label);
        }
        if (prefsEnabled()) {
            getPrefs().put("bt", getBaseTrack().getId());
        }
        I.warn("new VirtualCalhounTrack: ");
    }

    public Track getBaseTrack() {
        return m_baseTrack;
    }

    private static String buildVirtualTrackId(CalhounTrackType trackType,
            String analysisEventId, String id) {
        // I.warn("reinos: calling buildId with id " + id);
        if (id != null) {
            return id;
        }
        if (trackType == null) {
            I.error("null trackType for analysisEventId " + analysisEventId);
            return null;
        }
        return trackType.getId() + "_" + analysisEventId + "_v" + U.time();
    }

    private CalhounTrack m_baseTrack;

}
