import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.net.*;

public class Farm extends JPanel{
    private int numFarms;
    private ImageIcon farmIcon;
    private String farmName;
    private JLabel[][] farmLabels = new JLabel[2][5];
    private Color DarkGreen = new Color(82, 75, 36);

    private final int THEBOOT1 = 10, THEBOOT2 = 9, THEBOOT3 = 8, THEBOOT4 = 7, THEBOOT5 = 6, THEBOOT6 = 5,
            THEBOOT7 = 4;

    public Farm(int numFarms, URL farmImageURL, String farmName) {
        this.numFarms = numFarms;
        this.farmIcon = new ImageIcon(farmImageURL);
        this.farmName = farmName;
        setLayout(new GridLayout(2, 5));
        setBackground(DarkGreen);

        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 5; j++) {
                farmLabels[i][j] = new JLabel();
                farmLabels[i][j].setHorizontalAlignment(JLabel.CENTER);
                farmLabels[i][j].setVerticalAlignment(JLabel.CENTER);
                add(farmLabels[i][j]);
            }
        }
        if (this.numFarms <= 0) {
            return;
        }

        int firstRow = Math.min(this.numFarms, 5);
        for (int i = 0; i < firstRow; i++) {
            farmLabels[0][i].setIcon(farmIcon);
        }

        
        if (this.numFarms > 5) {
            int secondRow = Math.min(this.numFarms - 5, 5);
            for (int i = 0; i < secondRow; i++) {
                farmLabels[1][i].setIcon(farmIcon);
            }
        }
    }

    public String getFarmName() {
        return this.farmName;
    }

    public void removeFarm(int farmsToRemove) {
        for (int i = 0; i < farmsToRemove; i++) {
            if (this.numFarms > 5) {
                farmLabels[1][this.numFarms - 6].setIcon(null);
            } else if (this.numFarms <= 5 && this.numFarms > 0) {
                farmLabels[0][this.numFarms - 1].setIcon(null);
            }
            this.numFarms--;
        }
    }

    public int setNumFarms(int numFarms) {
        this.numFarms = numFarms;
        
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 5; j++) {
                farmLabels[i][j].setIcon(null);
            }
        }
        
        if (this.numFarms <= 0) {
            this.revalidate();
            this.repaint();
            return this.numFarms;
        }

        int firstRow = Math.min(this.numFarms, 5);
        for (int i = 0; i < firstRow; i++) {
            farmLabels[0][i].setIcon(farmIcon);
        }

        if (this.numFarms > 5) {
            int secondRow = Math.min(this.numFarms - 5, 5);
            for (int i = 0; i < secondRow; i++) {
                farmLabels[1][i].setIcon(farmIcon);
            }
        }
        
        this.revalidate();
        this.repaint();
        return this.numFarms;
    }
    
    public int getNumFarms() {
        return this.numFarms;
    }

    public void revolt(int Level) {
        int votes = 0;
        if (this.numFarms <= 0) {
            return;
        }
        Random rand = new Random();
        int threshold;
        if (Level == 1 || Level == 2) {
            threshold = THEBOOT1;
        } else if (Level == 3) {
            threshold = THEBOOT2;
        } else if (Level == 4) {
            threshold = THEBOOT3;
        } else if (Level == 5) {
            threshold = THEBOOT4;
        } else if (Level == 6) {
            threshold = THEBOOT5;
        } else if (Level == 7) {
            threshold = THEBOOT6;
        } else if (Level == 8){
            threshold = THEBOOT7;
        } else {
            threshold = 3;
        }

        for (int i = 0; i < this.numFarms; i++) {
            int vote = rand.nextInt(10) + 1;
            if (vote >= threshold) {
                votes++;
            }
        }

        if (votes == this.numFarms) {
            if (this.numFarms >= 2) {
                int removeCount = this.numFarms / 2;
                removeFarm(removeCount);
            } else {
                removeFarm(1);
            }
        } else if (votes > this.numFarms / 2) {
            removeFarm(1);
        }
    }
    
}
