/**
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 *
 * Copyright (C)
 * <a href="http://www.inab.org">Spanish National Institute of Bioinformatics (INB)</a>
 * <a href="http://www.bsc.es">Barcelona Supercomputing Center (BSC)</a>
 * <a href="http://inb.bsc.es">Computational Node 6</a>
 */

package org.inb.biomoby.client.gui.ontology;

import org.inb.biomoby.client.gui.ISequenceCoordinateTransformer;
import org.inb.biomoby.client.gui.Subsequence;
import org.inb.biomoby.shared.datatypes.MobyInteger;
import org.inb.biomoby.shared.datatypes.MobyString;
import org.inb.biomoby.shared.ontology.CommentedAASubsequence;

/**
 * @author Dmitry Repchevsky
 */

public class GenericSubsequenceComponent extends GenericSequenceComponent
{
    private GenericSubsequence characters;
    private CommentedAASubsequence sequence;
    
    public GenericSubsequenceComponent()
    {
    }
    
    public GenericSubsequenceComponent(CommentedAASubsequence sequence)
    {
        super(sequence);
        
        this.sequence = sequence;
    }
    
    @Override
    public GenericSubsequence getCharSequence()
    {
        if (characters == null)
        {
            if (sequence == null)
            {
                return new GenericSubsequence();
            }
            else
            {
                characters = new GenericSubsequence(sequence);
            }
        }
        
        return characters;
    }
    
    public void setSequence(CommentedAASubsequence sequence)
    {
        repaint();

        if (this.sequence != sequence)
        {
            this.sequence = sequence;
            
            getTransformer().setPosition(0);
        }
        
        characters = null;
    }
    
    public class GenericSubsequence extends Subsequence
    {
        private String substring;
        
        public final int start;
        public final int end;
        
        public GenericSubsequence()
        {
            substring = "";
            
            start = 0;
            end = 0;
        }
        
        public GenericSubsequence(CommentedAASubsequence sequence)
        {            
            MobyInteger startMobyInteger = sequence.getStart();
            if (startMobyInteger != null)
            {
                start = Math.max(0, startMobyInteger.getInteger());
            }
            else
            {
                start = 0;
            }

            MobyInteger endMobyInteger = sequence.getEnd();
            if (endMobyInteger != null)
            {
                end = Math.max(0, endMobyInteger.getInteger());
            }
            else
            {
                end = 0;
            }

            MobyString mobyString = sequence.getSequenceString();

            if (mobyString != null)
            {
                substring = mobyString.getString();
            }
            else
            {
                substring = "";
            }
            
            if (start > end)
            { // reverse string
                StringBuilder sb = new StringBuilder(substring);
                sb.reverse();
                substring = sb.toString();
            }
        }

        @Override
        public int getStart()
        {
            return Math.min(start, end);
        }

        @Override
        public int getEnd()
        {
            return Math.max(start, end);
        }

        @Override
        public String getCharSequence()
        {
            return substring;
        }

        @Override
        public int length()
        {
            ISequenceCoordinateTransformer transformer = getTransformer();

            return transformer.getLength();
        }
    }
}
