import java.util.*;
import javax.swing.JOptionPane;

class Deal {
    public static String bAcuan;
    public static Vector pemenang = new Vector();
    public static List dealHand(List deck, int n) {
    int deckSize = deck.size();
    List handView = deck.subList(deckSize-n, deckSize);    

    List hand = new ArrayList(handView);
    handView.clear();
    return hand;
    }
    public static List dealAcuan(List deck) {
    int deckSize = deck.size();
    List handView = deck.subList(deckSize-1, deckSize);

    List hand = new ArrayList(handView);
    handView.clear();
    return hand;
    }
    public static void main(String args[]) {
        int numHands ;
        int cardsPerHand ;
        Vector tmp1 = new Vector();
        
        String str21 = JOptionPane.showInputDialog("Masukkan N Pemain dan M kartu \nyang dibagikan dengan format : [N] [M] !!!");
        StringTokenizer bagi = new StringTokenizer(str21);
        
        numHands =Integer.parseInt(bagi.nextToken());
        cardsPerHand = Integer.parseInt(bagi.nextToken());

        String[] suit = new String[] {"spades", "hearts",
                                      "diamonds", "clubs"};
        String[] rank = new String[]
            {"ace","2","3","4","5","6","7","8",
             "9","10","jack","queen","king"};
        List deck = new ArrayList();    
        
        Vector pemain = new Vector();
        for (int i=0; i<suit.length; i++)
            for (int j=0; j<rank.length; j++)
                deck.add(rank[j] + " " + suit[i]);

        Collections.shuffle(deck);
        List acuan = new ArrayList(dealAcuan(deck));
        StringTokenizer str = new StringTokenizer(acuan.get(0).toString());
        str.nextToken();
        bAcuan = str.nextToken();
        System.out.println("Kartu Acuan : " + acuan);
        for (int i=0; i<numHands; i++)
        {
            List lst = new ArrayList(dealHand(deck, cardsPerHand));                        
            pemain.add(lst);
            System.out.println("Pemain " + (i+1) + " " + lst);            
        }
        System.out.println("Jumlah kartu di deck : " + deck.size());
        System.out.println();
        for(int i=0; i<numHands;i++){
            System.out.println("Pemain " + (i+1) + " ==> ");
            if(cariKartu((List)pemain.get(i),tmp1)){
                List ls = (ArrayList) tmp1.get(i);
                buang(ls,pemain,i);                
            }
            else{
                minum(pemain,i,deck);
            }
            System.out.println(pemain.get(i));
            System.out.println("Jumlah kartu di deck : " + deck.size());
            System.out.println("");
        }
        pemenang_remi();
    }
    
    public static void pemenang_remi(){
        int winner = 0;        
        int bnd2=0;
        List kartu = new ArrayList();
        List pemng1 = (ArrayList) pemenang.get(0);
        StringTokenizer str = new StringTokenizer(pemng1.get(0).toString());
        String pemain1 = str.nextToken();
        if(!pemain1.equals("ace") & !pemain1.equals("king") & !pemain1.equals("queen") & !pemain1.equals("jack"))
           bnd2 = Integer.parseInt(pemain1);
        
        for(int i=0;i<pemenang.size();i++){
            List tmp = (ArrayList) pemenang.get(i);
            kartu.add(tmp.get(0).toString());
            
        }        
        
        System.out.print("Kartu Dari Para Pemain : ");
        
        for(int i=0;i<pemenang.size();i++){
            List pemng = (ArrayList) pemenang.get(i);
            StringTokenizer str2 = new StringTokenizer(pemng.get(0).toString());
            String pemain2 = str2.nextToken();            
            
            if(pemain2.equals("ace")) { winner = i;break;}            
            else if( pemain2.equals("king") & !cariKartu(kartu,"ace")) { winner = i;break;}
            else if( pemain2.equals("queen") & !cariKartu(kartu,"king") & !cariKartu(kartu,"ace")) { winner = i;break;}
            else if( pemain2.equals("jack") & !cariKartu(kartu,"queen") & !cariKartu(kartu,"king") & !cariKartu(kartu,"ace")) { winner = i;break;}
            else if(!pemain2.equals("ace") & !pemain2.equals("king") & !pemain2.equals("queen") & !pemain2.equals("jack")){
                int ank = new Integer(Integer.parseInt(pemain2));
                if(ank > bnd2) { winner = i;}
            }
        }
        System.out.println(kartu);
        System.out.println("Pemenang Dalam Permainan Ini adalah : Pemain Ke : " + (winner + 1));
    }
    
    public static void minum(Vector v, int i, List deck){
        List pem = (ArrayList) v.get(i);
        List ambil = new ArrayList();       
        
        while(true){
            ambil = dealAcuan(deck);        
            StringTokenizer str = new StringTokenizer(ambil.iterator().next().toString());        
            String angka = new String(str.nextToken());
            String acuan = new String(str.nextToken());
            if(acuan.equals(bAcuan)){
                pemenang.add(ambil);
                System.out.println("Buang : " + ambil);
                break;
            }            
            pem.add(angka + " " + acuan);
            System.out.println("Minum : " + ambil);
        }
        v.remove(i);
        v.add(i,pem);
    }
    public static void buang(List kartu, Vector v, int i){
         int bnd2=0;
        String banding=new String(), banding2=new String();
        StringTokenizer bnd = new StringTokenizer(kartu.iterator().next().toString());        
        banding = bnd.nextToken();
        banding2 = bnd.nextToken();
        if(!banding.equals("ace") && !banding.equals("king") && !banding.equals("queen") && !banding.equals("jack")) bnd2 = Integer.parseInt(banding);
        
        for(Iterator it = kartu.iterator();it.hasNext();){
            StringTokenizer angka = new StringTokenizer(it.next().toString());
            String str = angka.nextToken();            
            String str2 = angka.nextToken();
            if(str.equals("ace")) { banding = str; banding2 = str2; break;}            
            else if( str.equals("king") & !cariKartu(kartu,"ace")) { banding = str; banding2 = str2;break;}            
            else if( str.equals("queen") & !cariKartu(kartu,"king") & !cariKartu(kartu,"ace")) { banding = str; banding2 = str2; break;}            
            else if( str.equals("jack") & !cariKartu(kartu,"queen") & !cariKartu(kartu,"king") & !cariKartu(kartu,"ace")) { banding = str; banding2 = str2; break;}                     
            else if(!str.equals("ace") && !str.equals("king") && !str.equals("queen") && !str.equals("jack")){
                int ank = new Integer(Integer.parseInt(str));
                if(ank > bnd2) { banding = str; banding2 = str2;}
            }
        }
        List list_buang = new ArrayList();
        list_buang.add(banding + " " + banding2);        
        List kartu2 = (ArrayList) v.get(i);        
        kartu2.remove(list_buang.get(0));
        v.remove(i);
        v.add(i,kartu2);
        System.out.println("Buang : " + list_buang);
        pemenang.add(list_buang);
    }
    public static boolean cariKartu(List kartu,String ank){
        String banding,angka;        
        boolean balik=false;
            for(Iterator it=kartu.iterator();it.hasNext();){
                StringTokenizer str = new StringTokenizer(it.next().toString());
                angka = str.nextToken();
                banding = str.nextToken();
                if(ank.equals(angka)){                    
                    balik = true;
                }
            }        
        return balik;
    }
    
    public static boolean cariKartu(List kartu, Vector tmp){
        String banding,angka;
        List arrlist = new ArrayList();
        boolean balik=false;
            for(Iterator it=kartu.iterator();it.hasNext();){
                StringTokenizer str = new StringTokenizer(it.next().toString());
                angka = str.nextToken();
                banding = str.nextToken();
                if(bAcuan.equals(banding)){
                    arrlist.add(angka + " " + banding);
                    balik = true;
                }
            }
        tmp.add(arrlist);
        return balik;
    }
}