// Path: src/be/uzleuven/gc/logistics/GBSX/utils/sampleBarcodeEnzyme/model/BasePair.java
// public class BasePair {
//     
//     /**
//      * returns true if the the found base can be the espected base
//      * @param base1 char | the espected base (A, C, G or T)
//      * @param base2 char | the found base (A,C,G,T,R,Y,K,M,S,W,B,D,H,V,N)
//      * @return true if base2 possible is base1
//      */
//     public static boolean canBeEqual(char base1, char base2){
//         base1 = Character.toUpperCase(base1);
//         for (char possibleBase : BasePair.getPossibleBasePairs(base2)){
//             if (possibleBase == base1){
//                 return true;
//             }
//         }
//         return false;
//     }
//     
//     /**
//      * transforms the given base to a list of possible bases (usefull for R,Y,...)
//      * @param base char | the base to transform
//      * @return arraylist of character | the possible corresponding bases.
//      */
//     private static ArrayList<Character> getPossibleBasePairs(char base){
//         base = Character.toUpperCase(base);
//         ArrayList<Character> base1List = new ArrayList();
//         switch (base){
//             case 'A' : base1List.add('A');
//                 break;
//             case 'C' : base1List.add('C');
//                 break;
//             case 'G' : base1List.add('G');
//                 break;
//             case 'T' : base1List.add('T');
//                 break;
//             case 'R' : base1List.add('A');
//                 base1List.add('G');
//                 break;
//             case 'Y' : base1List.add('T');
//                 base1List.add('G');
//                 break;
//             case 'K' : base1List.add('G');
//                 base1List.add('T');
//                 break;
//             case 'M' : base1List.add('A');
//                 base1List.add('C');
//                 break;
//             case 'S' : base1List.add('G');
//                 base1List.add('C');
//                 break;
//             case 'W' : base1List.add('A');
//                 base1List.add('T');
//                 break;
//             case 'B' : base1List.add('G');
//                 base1List.add('T');
//                 base1List.add('C');
//                 break;
//             case 'D' : base1List.add('G');
//                 base1List.add('A');
//                 base1List.add('T');
//                 break;
//             case 'H' : base1List.add('A');
//                 base1List.add('C');
//                 base1List.add('T');
//                 break;
//             case 'V' : base1List.add('G');
//                 base1List.add('C');
//                 base1List.add('A');
//                 break;
//             case 'N' : base1List.add('A');
//                 base1List.add('G');
//                 base1List.add('C');
//                 base1List.add('T');
//                 break;
//             default : base1List.add('A');
//                 base1List.add('G');
//                 base1List.add('C');
//                 base1List.add('T');
//                 break;
//         }
//         return base1List;
//     }
//     
//     /**
//      * creates the complement of the given DNA
//      * @param sequence String | the sequence of DNA where the complement must be searched
//      * @return the complement of the given DNA
//      */
//     public static String getComplementSequence(String sequence){
//         String complementDNApiece = "";
//         //sequence = sequence.toUpperCase();
//         for (char base : sequence.toCharArray()){
//             switch (base){
//                 case 'A': complementDNApiece = 'T' + complementDNApiece;
//                     break;
//                 case 'T' : complementDNApiece = 'A' + complementDNApiece;
//                     break;
//                 case 'G' : complementDNApiece = 'C' + complementDNApiece;
//                     break;
//                 case 'C': complementDNApiece = 'G' + complementDNApiece;
//                     break;
//                 case 'a': complementDNApiece = 't' + complementDNApiece;
//                     break;
//                 case 't' : complementDNApiece = 'a' + complementDNApiece;
//                     break;
//                 case 'g' : complementDNApiece = 'c' + complementDNApiece;
//                     break;
//                 case 'c': complementDNApiece = 'g' + complementDNApiece;
//                     break;
//                 case '[' : complementDNApiece = ']' + complementDNApiece;
//                     break;
//                 case ']' : complementDNApiece = '[' + complementDNApiece;
//                     break;
//                 default : complementDNApiece = base + complementDNApiece;
//                     break;
//             }
//         }
//         return complementDNApiece;
//     }
// }


import java.util.HashSet;
import be.uzleuven.gc.logistics.GBSX.utils.sampleBarcodeEnzyme.model.BasePair;
import java.util.Arrays;
import java.util.Collection;
    private EnzymeEnum(String name, String[] initialCutSite){
        this.name = name;
        this.initialCutSiteRemnant = initialCutSite;
    }
    
    /**
     * 
     * @return String the name of the enzyme
     */
    public String getName(){
        return this.name;
    }
        
    /**
     * returns all cutsites
     * @return Collection of String | all the cutsites of the enzyme in a collection
     */
    public Collection<String> getInitialCutSiteRemnant(){
        HashSet<String> cutsitesSet = new HashSet();
        cutsitesSet.addAll(Arrays.asList(this.initialCutSiteRemnant));
        return cutsitesSet;
    }
    
    /**
     * returns all complement cutsites
     * @return Collection of String | all the complement cutsites of the enzyme in a collection
     */
    public Collection<String> getComplementCutSiteRemnant() {
        HashSet<String> cutsitesSet = new HashSet();
        for (String cutsite : this.initialCutSiteRemnant){
// Path: src/be/uzleuven/gc/logistics/GBSX/utils/sampleBarcodeEnzyme/model/BasePair.java
// public class BasePair {
//     
//     /**
//      * returns true if the the found base can be the espected base
//      * @param base1 char | the espected base (A, C, G or T)
//      * @param base2 char | the found base (A,C,G,T,R,Y,K,M,S,W,B,D,H,V,N)
//      * @return true if base2 possible is base1
//      */
//     public static boolean canBeEqual(char base1, char base2){
//         base1 = Character.toUpperCase(base1);
//         for (char possibleBase : BasePair.getPossibleBasePairs(base2)){
//             if (possibleBase == base1){
//                 return true;
//             }
//         }
//         return false;
//     }
//     
//     /**
//      * transforms the given base to a list of possible bases (usefull for R,Y,...)
//      * @param base char | the base to transform
//      * @return arraylist of character | the possible corresponding bases.
//      */
//     private static ArrayList<Character> getPossibleBasePairs(char base){
//         base = Character.toUpperCase(base);
//         ArrayList<Character> base1List = new ArrayList();
//         switch (base){
//             case 'A' : base1List.add('A');
//                 break;
//             case 'C' : base1List.add('C');
//                 break;
//             case 'G' : base1List.add('G');
//                 break;
//             case 'T' : base1List.add('T');
//                 break;
//             case 'R' : base1List.add('A');
//                 base1List.add('G');
//                 break;
//             case 'Y' : base1List.add('T');
//                 base1List.add('G');
//                 break;
//             case 'K' : base1List.add('G');
//                 base1List.add('T');
//                 break;
//             case 'M' : base1List.add('A');
//                 base1List.add('C');
//                 break;
//             case 'S' : base1List.add('G');
//                 base1List.add('C');
//                 break;
//             case 'W' : base1List.add('A');
//                 base1List.add('T');
//                 break;
//             case 'B' : base1List.add('G');
//                 base1List.add('T');
//                 base1List.add('C');
//                 break;
//             case 'D' : base1List.add('G');
//                 base1List.add('A');
//                 base1List.add('T');
//                 break;
//             case 'H' : base1List.add('A');
//                 base1List.add('C');
//                 base1List.add('T');
//                 break;
//             case 'V' : base1List.add('G');
//                 base1List.add('C');
//                 base1List.add('A');
//                 break;
//             case 'N' : base1List.add('A');
//                 base1List.add('G');
//                 base1List.add('C');
//                 base1List.add('T');
//                 break;
//             default : base1List.add('A');
//                 base1List.add('G');
//                 base1List.add('C');
//                 base1List.add('T');
//                 break;
//         }
//         return base1List;
//     }
//     
//     /**
//      * creates the complement of the given DNA
//      * @param sequence String | the sequence of DNA where the complement must be searched
//      * @return the complement of the given DNA
//      */
//     public static String getComplementSequence(String sequence){
//         String complementDNApiece = "";
//         //sequence = sequence.toUpperCase();
//         for (char base : sequence.toCharArray()){
//             switch (base){
//                 case 'A': complementDNApiece = 'T' + complementDNApiece;
//                     break;
//                 case 'T' : complementDNApiece = 'A' + complementDNApiece;
//                     break;
//                 case 'G' : complementDNApiece = 'C' + complementDNApiece;
//                     break;
//                 case 'C': complementDNApiece = 'G' + complementDNApiece;
//                     break;
//                 case 'a': complementDNApiece = 't' + complementDNApiece;
//                     break;
//                 case 't' : complementDNApiece = 'a' + complementDNApiece;
//                     break;
//                 case 'g' : complementDNApiece = 'c' + complementDNApiece;
//                     break;
//                 case 'c': complementDNApiece = 'g' + complementDNApiece;
//                     break;
//                 case '[' : complementDNApiece = ']' + complementDNApiece;
//                     break;
//                 case ']' : complementDNApiece = '[' + complementDNApiece;
//                     break;
//                 default : complementDNApiece = base + complementDNApiece;
//                     break;
//             }
//         }
//         return complementDNApiece;
//     }
// }


// Path: src/be/uzleuven/gc/logistics/GBSX/utils/enzyme/model/EnzymeEnum.java
import java.util.HashSet;
import be.uzleuven.gc.logistics.GBSX.utils.sampleBarcodeEnzyme.model.BasePair;
import java.util.Arrays;
import java.util.Collection;

    private EnzymeEnum(String name, String[] initialCutSite){
        this.name = name;
        this.initialCutSiteRemnant = initialCutSite;
    }
    
    /**
     * 
     * @return String the name of the enzyme
     */
    public String getName(){
        return this.name;
    }
        
    /**
     * returns all cutsites
     * @return Collection of String | all the cutsites of the enzyme in a collection
     */
    public Collection<String> getInitialCutSiteRemnant(){
        HashSet<String> cutsitesSet = new HashSet();
        cutsitesSet.addAll(Arrays.asList(this.initialCutSiteRemnant));
        return cutsitesSet;
    }
    
    /**
     * returns all complement cutsites
     * @return Collection of String | all the complement cutsites of the enzyme in a collection
     */
    public Collection<String> getComplementCutSiteRemnant() {
        HashSet<String> cutsitesSet = new HashSet();
        for (String cutsite : this.initialCutSiteRemnant){
            cutsitesSet.add(BasePair.getComplementSequence(cutsite));