import edu.neu.ccs.*;
import edu.neu.ccs.gui.*;
import edu.neu.ccs.codec.*;
import edu.neu.ccs.console.*;
import edu.neu.ccs.filter.*;
import edu.neu.ccs.jpf.*;
import edu.neu.ccs.parser.*;
import edu.neu.ccs.pedagogy.*;
import edu.neu.ccs.quick.*;
import edu.neu.ccs.util.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import java.util.*;
import java.math.*;
import java.beans.*;
import java.lang.reflect.*;
import java.net.*;
import java.util.regex.*;



public class CardFun extends DisplayPanel {
    
    String urlString =
        "http://www.ccs.neu.edu/jpt/images/jfitz_cards/";
    
    ImagePaintableLite[] paintables =
        WebImageTools.readImagesAsPaintableLite(urlString,"");
    
    int decksize = 52;
    
    PaintableSequence sequence;
    
    
    public CardFun(int howmany, int shift) {
        this(howmany, shift, -1, -1);
    }
    
    
    public CardFun
        (int howmany, int shift, double width, double height)
    {
        sequence = randomCardSequence(howmany, shift);
        adjustBounds2D(width, height);
        
        addObject(sequence);
        frame("Card Fun");
    }
    
    
    private void adjustBounds2D(double width, double height)
    {
        Rectangle2D bounds = sequence.getBounds2D();
        
        double x = bounds.getMinX();
        double y = bounds.getMinY();
        double w = bounds.getWidth();
        double h = bounds.getHeight();
        
        if (width < w)
            width = w;
        
        if (height < h)
            height = h;
        
        x -= (width - w) / 2;
        y -= (height - h) / 2;
        
        bounds = new Rectangle2D.Double(x, y, width, height);
        
        sequence.setDefaultBounds2D(bounds);
    }
    
    
    public MutatableWrapper[] getShuffledDeck() {
        MutatableWrapper[] mutatables =
            new MutatableWrapper[paintables.length];
        
        int[] indices =
            ProbStatTools.selectWithNoRepetition
                (decksize, decksize);
       
        for (int i = 0; i < decksize; i++)
            mutatables[i] =
                new MutatableWrapper
                    (paintables[indices[i]]);
        
        return mutatables;
    }
    
    
    public TablePanel randomCardPanel(int howmany) {
        if (howmany > decksize)
            howmany = decksize;
        
        TablePanel panel = new TablePanel(1, howmany);
        
        MutatableWrapper[] mutatables = getShuffledDeck();
        
        for (int i = 0; i < howmany; i++)
            panel.addObject(mutatables[i]);
        
        return panel;
    }
    
    
    public PaintableSequence randomCardSequence
        (int howmany, int shift)
    {
        if (howmany > decksize)
            howmany = decksize;
        
        PaintableSequence sequence = new PaintableSequence();
        
        MutatableWrapper[] mutatables = getShuffledDeck();
        
        for (int i = 0; i < howmany; i++) {
            mutatables[i].move(i * shift, 0);
            sequence.appendPaintable(mutatables[i]);
        }
            
        return sequence;
    }
    
}
