package calhoun.gebo.internal.db;

import java.awt.Color;
import java.util.HashMap;
import java.util.Map;

import calhoun.gebo.model.Feature;
import calhoun.gebo.model.FeatureTrack;
import calhoun.gebo.model.RangeTrack;
import calhoun.gebo.model.Segment;
import calhoun.gebo.model.Sequence;
import calhoun.gebo.model.SimpleSegment;
import calhoun.gebo.ui.TrackStyle;
import calhoun.gebo.util.Informer;

public class CalhounPolymorphicTrack extends FeatureTrack  {

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

    public CalhounPolymorphicTrack(CalhounTrack queryTrack,
            CalhounTrack nqsbTrack) {
        super(CalhounPolymorphicTrackManager.getInstance(), queryTrack.getId(),
                queryTrack.getLabel(), Color.GRAY, false, false, false, 3,
                queryTrack.getId());
        m_queryTrack = queryTrack;
        m_nqsbTrack = nqsbTrack;       
        // this.m_bioSampleId = trackLabel.replaceFirst("^");
        this.m_style = TrackStyle.POLYMORPHIC;
        setDefaultVisible(false);
        loadPrefs();
    }

    public String getBioSampleId() {
        if ( m_bioSampleId == null){
            m_bioSampleId = CalhounPolymorphicTrackManager.getBioSampleId(m_queryTrack);
        }
        return m_bioSampleId;
    }

    public CalhounTrack getQueryTrack() {
        return m_queryTrack;
    }

    public CalhounTrack getNQSBTrack() {
        return m_nqsbTrack;
    }

    public int getMaxRows() {
        return 1;
    }

    public Feature[] getFeatures(Segment s){
        I.warn("REINOS: gaga");
        return CalhounPolymorphicTrackManager.getInstance().getFeatures(s,this, true);
    }
    
    public CalhounValuedFeature getNQSBFeature(Sequence sequence) {
        if (m_nqsbTrack != null) {
            if (!m_sequenceToNQSBFeature.containsKey(sequence)) {
                CalhounValuedFeature nqsbFeature = null;
                Feature[] features = CalhounTrackManager.getInstance()
                        .getFeatures(new SimpleSegment(sequence),
                                getNQSBTrack());
                if (features.length == 1) {
                    nqsbFeature = (CalhounValuedFeature) features[0];
                } else if (features.length > 1) {
                    I.warn("Error! multiple valued features per nqsb track "
                            + m_nqsbTrack);
                } else {
                    I.warn("No nqsb features found for track " + m_nqsbTrack);
                }
                m_sequenceToNQSBFeature.put(sequence, nqsbFeature);
            }
            return m_sequenceToNQSBFeature.get(sequence);
        } else {
            I.warn("No nqsb track associated with polymorphic site track "
                    + getLabel());
            return null;
        }
    }

    private Map<Sequence, CalhounValuedFeature> m_sequenceToNQSBFeature = new HashMap<Sequence, CalhounValuedFeature>();;
    private CalhounTrack m_nqsbTrack;
    private CalhounTrack m_queryTrack;
    private String m_bioSampleId;

}