import java.awt.*;
import javax.swing.*;

// ====================================================================
class Graphique extends JFrame{
    static ImageIcon back = new ImageIcon("cards/back.gif");
    static ImageIcon backAPlat = new ImageIcon("cards/back-90.gif");
    ImageIcon[][] deck;
    ImageIcon[] player, center;
    ImageIcon sommetTas = back;
    boolean yATas = true;
    boolean fini = false;
    int pointsPour, pointsContre;
    int from, nbCenter;
    int[] nbCarteParJoueur = {0, 0, 0, 0};
    JPanel jpane;

    // ================================================================
    Graphique(){
	this.setTitle("Jeu de Belote");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	jpane = new SpecialPanel();
        this.setContentPane(jpane);
        jpane.setPreferredSize(new Dimension(570, 400));
        jpane.setBackground(Color.green);
        String suits = "shdc";
        String faces = "789tjqka";
        int cardPosition = 0;
	deck = new ImageIcon[4][8];
        for (int suit=0; suit<suits.length(); suit++) {
            for (int face=0; face<8; face++) {
                deck[suit][face] = 
		    new ImageIcon("cards/"+ faces.charAt(face)
				  + suits.charAt(suit) + ".gif");
            }
        }
	center = new ImageIcon[4];
	nbCenter = 0;
	player = new ImageIcon[0];
	sommetTas = back;
        this.pack();
        this.setVisible(true);
    }
    // ================================================================
    int intFromCouleur(Couleur coul){
	if (coul.nom == Couleur.Pique.nom)
	    return 0;
	else if (coul.nom == Couleur.Coeur.nom)
	    return 1;
	else if (coul.nom == Couleur.Carreau.nom)
	    return 2;
	else 
	    return 3;
    }
    // ================================================================
    class SpecialPanel extends JPanel{
	public void paintComponent(Graphics g) {
	    super.paintComponent(g);   // Required
	    int margin; 
	    // affichage cartes du joueur humain
	    if (player.length > 0){
		margin = 53 + ((8-nbCarteParJoueur[0])*55)/2;
		for (int i=0; i<player.length; i++){
		    player[i].paintIcon(this, g, i*55+margin, 280);
		    g.drawString(""+(i+1),i*55+margin+27,390);
		}
	    }
	    // affichage cartes du joueur 3
	    for (int i=0; i<nbCarteParJoueur[3]; i++){
		margin = 55 + ((8-nbCarteParJoueur[3])*20)/2;
		backAPlat.paintIcon(this, g, -70, i*20+margin);
	    }
	    // affichage des cartes du joueur 1
	    for (int i=0; i<nbCarteParJoueur[1]; i++){
		margin = 55 + ((8-nbCarteParJoueur[3])*20)/2;
		backAPlat.paintIcon(this, g, 520, i*20+margin);
	    }
	    // affichage des cartes du joueur 2
	    for (int i=0; i<nbCarteParJoueur[2]; i++){
		margin = 53 + ((8-nbCarteParJoueur[2])*55)/2;
		back.paintIcon(this, g, i*55+margin,-50);
	    }
            // affichage des cartes du centre
	    if (yATas){
		for (int i=0; i<12; i++){
		    sommetTas.paintIcon(this, g, 255+i, 120+i);
		}
	    }else{
		int depart = from;
		for (int i=0; i<nbCenter; i++){
		    center[i].paintIcon(this, g, xFromDep(depart), 
					yFromDep(depart));
		    depart++;
		}
	    }
            // affichage du résultat
	    if (fini){
		g.setColor(Color.yellow);
		Font f = new Font(g.getFont().getName(),
				  g.getFont().getStyle(),
				  g.getFont().getSize()*4);
		g.fillRect(205,175,200,100);
		g.setColor(Color.black);
		g.drawRect(205,175,200,100);
		g.drawString("Points de votre équipe:   " + 
			     pointsPour, 210,250);
		g.drawString("Points de l'autre équipe: " + 
			     pointsContre, 210,270);
		g.setFont(f);
		if (pointsPour > pointsContre){
		    g.drawString("Gagné!",225,220);
		}else{
		    g.drawString("Perdu!",225,220);
		}
	    }
	}
    }   
    // ================================================================
    int xFromDep(int x){
	switch (x%4) {
	    case 0: return 255;
	    case 1: return 255+60;
	    case 2: return 255;
	    case 3: return 255-60;
	}
	return 0;
    }
    // ================================================================
    int yFromDep(int x){
	switch (x % 4) {
	    case 0: return 80;
	    case 1: return 120;
	    case 2: return 160;
	    case 3: return 120;
	}
	return 0;
    }
    // ================================================================
    ImageIcon iconFromCarte(Carte c){
	int val;
	
	if (c.figure.nom == Figure.Sept.nom) val = 0;
	else if (c.figure.nom == Figure.Huit.nom) val = 1;
	else if (c.figure.nom == Figure.Neuf.nom) val = 2;
	else if (c.figure.nom == Figure.Dix.nom) val = 3;
	else if (c.figure.nom == Figure.Valet.nom) val = 4;
	else if (c.figure.nom == Figure.Dame.nom) val = 5;
	else if (c.figure.nom == Figure.Roi.nom) val = 6;
	else val = 7;
	
	return deck[intFromCouleur(c.couleur)][val];
    }
    // ================================================================
    ImageIcon[] iconTabFromPaquet(PaquetDeCartes pq){
	ImageIcon[] res = new ImageIcon[pq.longueur];
	for (int i=0; i<pq.longueur; i++){
	    res[i] = iconFromCarte(pq.lesCartes[i]);
	}
	return res;
    }
    // ================================================================
    public  void affiche1(PaquetDeCartes pq, Carte sommet){
	yATas = true;
	player = iconTabFromPaquet(pq);
	sommetTas = iconFromCarte(sommet);
	for (int i = 0; i<4; i++){
	    nbCarteParJoueur[i] = pq.longueur;
	}
	jpane.repaint();
    }
    // ================================================================
    public  void affiche2(PaquetDeCartes pq){
	yATas = false;
	player = iconTabFromPaquet(pq);
	for (int i = 0; i<4; i++){
	    nbCarteParJoueur[i] = pq.longueur;
	}
	jpane.repaint();
    }
    // ================================================================
    public  void effaceTapis(){
	yATas = false;
	nbCenter=0;
	jpane.repaint();
    }
    // ================================================================
    public void ordinateurJoue(Carte carteJouee, int joueur){
	if (nbCenter==0)
	    from = joueur;
	else if (nbCenter == 4)
	    nbCenter=0;
	nbCarteParJoueur[joueur]--;
	center[nbCenter] = iconFromCarte(carteJouee);
	nbCenter++;
	jpane.repaint();
    }
    // ================================================================
    public void joueurHumainJoue(PaquetDeCartes pq, Carte carteJouee){
	player = iconTabFromPaquet(pq);
	if (nbCenter==0)
	    from = 2;
	else if (nbCenter == 4)
	    nbCenter=0;
	center[nbCenter] = iconFromCarte(carteJouee);
	nbCenter++;
	yATas = false;
	nbCarteParJoueur[0] = pq.longueur;
	jpane.repaint();
    }
    // ================================================================
    public void perduGagne(int pp, int pc){
	fini = true;
	pointsPour = pp;
	pointsContre = pc;
	jpane.repaint();
    }
}
