/**
 * 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 java.util.List;
import org.inb.biomoby.shared.datatypes.MobyInteger;
import org.inb.biomoby.shared.datatypes.MobyString;
import org.inb.biomoby.shared.ontology.AnnotatedStructure;
import org.inb.biomoby.shared.ontology.StructureBoundaries;
import org.inb.biomoby.shared.ontology.StructureDomain;
import org.inb.biomoby.shared.ontology.StructureFragment;

/**
 * @author Dmitry Repchevsky
 */

public class AnnotatedStructureComponent<T extends AnnotatedStructure> extends PDB__TextComponent<T>
{
    private static final String[] COLORS =
    {"red", "blue", "yellow", "green", "aqua", "darkmagenta", "darkgray", "orange" , "indigo",
     "darkolivegreen", "tomato", "navy", "maroon", "pink", "teal", "darkgoldenrod"};

    public AnnotatedStructureComponent(T annotatedStructure)
    {
        super(annotatedStructure);
    }

    @Override
    protected String getDefaultScript()
    {
        AnnotatedStructure annotatedStructure = getData();

        StringBuilder sb = new StringBuilder();
        sb.append("select all; spacefill off; cartoons off; ribbon 50;");

        List<? extends StructureDomain> domains = annotatedStructure.getStructureDomains();

        int i = 0;
        for (StructureDomain domain : domains)
        {
            StringBuilder title = new StringBuilder();

            MobyString name = domain.getName();
            if (name != null)
            {
                String domainName = name.getString();
                if (domainName != null && domainName.length() > 0)
                {
                    title.append("domain ").append(domainName).append(" ");
                }
            }

            List<? extends StructureBoundaries> boundaries = domain.getSegments();

            for (StructureBoundaries boundary : boundaries)
            {
                MobyInteger startMobyInteger = boundary.getStart();
                MobyInteger endMobyInteger = boundary.getEnd();

                if (startMobyInteger != null && endMobyInteger != null)
                {
                    sb.append("select ");
                    sb.append(startMobyInteger.getInteger());
                    sb.append('-');
                    sb.append(endMobyInteger.getInteger());

                    sb.append("; color ").append(COLORS[i]);
                    sb.append("; color cartoon ").append(COLORS[i]);
                    sb.append("; cartoons on;");

//                    MobyString chainMobyString = boundary.getChain();
//                    if (chainMobyString != null)
//                    {
//                        String chain = chainMobyString.getString();
//
//                        if (chain != null && chain.length() > 0)
//                        {
//                            title.append("chain ").append(chain);
//                        }
//                    }
//
//                    if (title.length() > 0)
//                    {
//                        sb.append("define residues ");
//                        sb.append(startMobyInteger.getInteger());
//                        sb.append('-');
//                        sb.append(endMobyInteger.getInteger());
//                        sb.append(" as ");
//                        sb.append(title.toString());
//                    }


                }
            }
            i = i < COLORS.length ? i + 1 : 0;
        }

        List<? extends StructureFragment> fragments = annotatedStructure.getStructureFragments();

        for (StructureFragment fragment : fragments)
        {
            MobyInteger startMobyInteger = fragment.getStart();
            MobyInteger endMobyInteger = fragment.getEnd();

            if (startMobyInteger != null && endMobyInteger != null)
            {
                sb.append("select ");
                sb.append(startMobyInteger.getInteger());
                sb.append('-');
                sb.append(endMobyInteger.getInteger());

                sb.append("; color ").append(COLORS[i]);
                sb.append("; color cartoon ").append(COLORS[i]);
                sb.append("; cartoons on;");
            }

            i = i < COLORS.length ? i + 1 : 0;
        }

        return sb.toString();
    }
}