/**
 * @(#)Bits.java
 * @author JLMJ
 * @date 2001-10-04
 */
package minoids1.controls;

import minoids1.*;
import minoids1.counter.*;

public final class Tester
{
    public static String shiftBits(int size, int ones, int shifts) {
        StringBuffer sb = new StringBuffer();
        Bits bits = new Bits();
        bits.set(size, ones);
        boolean bit;
        for (int i=0; i < shifts; i++) {
            sb.append(bits + "\n");
            bits.shiftLeft(false);
        }
        return sb.toString();
    }
    
    public static String translationsBoxesTest(int order) {
        Box[] boxes = Box.getAllTranslationsBoxes(order);
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < boxes.length; i++)
            sb.append((i+1) + ": " + boxes[i] + "\n");
        return sb.toString();
    }

    public static String rotationsBoxesTest(int order) {
        Box[] boxes = Box.getAllRotationsBoxes(order);
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < boxes.length; i++)
            sb.append((i+1) + ": " + boxes[i] + "\n");
        return sb.toString();
    }
    
    public static String anyMinoidsConnectionsBitsTest(Box box) {
        StringBuffer sb = new StringBuffer();
        Bits[] bits = box.getAnyConnectionsBits();
        sb.append("connections:\n");
        for (int i=0; i < bits.length; i++) {
            sb.append((i+1) + ". " + bits[i] + "\n");
        }
        sb.append("minoids:\n");
        for (int i=0; i < box.getMinoids().length; i++)
            sb.append(box.getMinoids()[i] + "\n");
        
        return sb.toString();
    }
    
    public static String mixedMinoidsTranslationsCountingTest(int order, Box box) {
        StringBuffer sb = new StringBuffer();
        sb.append(box + "\n");
        sb.append("Minoid Order = " + order + "\n");
        TranslationsCounter c = new TranslationsCounter(box, false);
        c.countAnyMinoidsTranslations(order);
        sb.append("Mixed " + order + "-minoids Translations Count = "
            + c.getTranslations());
        return sb.toString();
    }
    
    public static String countAllTranslationsPolyominoesTest(int order) {
        StringBuffer sb = new StringBuffer();
        sb.append("Translations Polyominoids of order " + order + "\n");
        int total = 0;
        Box[] boxes = Box.getAllRotationsBoxes(order);
        for (int i=0; i < boxes.length; i++) {
            if (boxes[i].getX() == 0) {
                TranslationsCounter counter = new TranslationsCounter(boxes[i], false);
                counter.countAnyMinoidsTranslations(order);
                int t = counter.getTranslations();
                if (boxes[i].getY() != boxes[i].getZ())
                    t *= 2;
                sb.append(boxes[i] + " -> " + t + "\n");
                total += t;
            }
        }
        sb.append("total -> " + total + "\n");
        return sb.toString();
    }
    
    private static void displayMinoids(TranslationsCounter c) {
        Bits[] bits = c.getMinoidsInBox();
        if (bits == null || bits.length == 0) {
            System.out.println("No minoids");
        } else {
            for (int i=0; i < bits.length; i++)
                System.out.println(bits[i] + " " + i);
        }
    }
    
    public static void displayMixedMinoids(Box box, int order) {
        TranslationsCounter c = new TranslationsCounter(box, true);
        c.countAnyMinoidsTranslations(order);
        System.out.println("mixed " + order + "-minoids inside " + box);
        displayMinoids(c);
    }
        
    public static void displayHardMinoids(Box box, int order) {
        TranslationsCounter c = new TranslationsCounter(box, true);
        c.countHardMinoidsTranslations(order);
        System.out.println("hard " + order + "-minoids inside " + box);
        displayMinoids(c);
    }

    public static void displaySoftMinoids(Box box, int order) {
        TranslationsCounter c = new TranslationsCounter(box, true);
        c.countSoftMinoidsTranslations(order);
        System.out.println("soft " + order + "-minoids inside " + box);
        displayMinoids(c);
    }

    
    
    public static void main(String[] args) {
        //System.out.println(shiftBits(70, 10, 100));
        //System.out.println(translationsBoxesTest(3));
        //System.out.println(rotationsBoxesTest(5));
        //System.out.println(mixedMinoidsConnectionsBitsTest(new Box(1,1,1)));
        //System.out.println(mixedMinoidsTranslationsCountingTest(5, new Box(3,3,0)));
        //System.out.println(countAllTranslationsPolyominoesTest(10));
        displayMixedMinoids(new Box(1,2,4), 6);
    }
}

