package edu.school.hangman;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.Color;
	/**
	 * Информатика, 8 клас, издателство Просвета, 2017
	 * Автори: Светла Бойчева, Николина Николова, Елиза Стефанова, Антон Денев
	 * Урок 3.6.2.3 Последователно търсене на елемент от масив, отговарящ на дадено условие
	 * Задача:„Бесеница” е популярна игра, в която участват двама играчи. 
	 * Единият си намисля дума, а другия трябва да я познае. Играчът, който си намисля думата 
	 * изписва чертички на местата на буквите. На всеки ход играчът, който познава думата
	 * казва по една буква. Ако буквата я има в думата — се отбелязват нейните срещания,
	 * като се заместват съответните чертички. В случай, че буквата не се среща в думата се
	 * рисува част от човече. Когато човечето се изрисува изцяло играта приключва със загуба.
	 * Ако играчът познае думата преди да се изрисува цялото човече, то той побеждава. Да се
	 * напише приложение Hangman, което да реализира играта „Бесеница”, като приложението е
	 * в ролята на играча, който си намисля думата, а потребителят е този, който познава.
	 * 
	 * Версия 1. Открийте грешката!
	 */
public class HangmanFrame extends JFrame {

	private JPanel contentPane;


	/**
	 * Launch the application.
	 */
	
	// дефиниране на масиви от низове с по един символ за всеки тип думи
	String[] informatics = { "м", "а", "с", "и", "в", "и" };
	String[] animal = { "п", "л", "ъ", "х" };
	String[] town = { "в", "ъ", "р", "ш", "е", "ц" };
	String[] word;  // "намислената" дума, която трябва да познае играча
	String[] pattern; // шаблон с _ за "намислената" дума
	int correct = 0; // брой познати букви от "намислената" дума
	int errors = 0; // брой грешки при познаване на "намислената" дума
	final int MAX_LIVES = 6; // максимален брой грешки при познаване на "намислената" дума
	String wrongLetters = ""; // грешни букви въведени от играча по време на играта
	String correctWord = ""; // "намислената" дума
	
	
	
	private JTextField txtLetter;
	private JComboBox<String> comboBox;
	private JLabel lblLives;
	private JButton btnNewGuess;
	private JLabel lblPattern;
	private JLabel lblWrongLetters;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					HangmanFrame frame = new HangmanFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public HangmanFrame() {
		setTitle("\u0411\u0435\u0441\u0435\u043D\u0438\u0446\u0430");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 314, 266);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		lblLives = new JLabel("\u0413\u0440\u0435\u0448\u043A\u0438 (0)");
		lblLives.setFont(new Font("Tahoma", Font.BOLD, 14));
		lblLives.setBounds(10, 183, 91, 30);
		contentPane.add(lblLives);

		lblPattern = new JLabel(" ");
		lblPattern.setFont(new Font("Tahoma", Font.BOLD, 18));
		lblPattern.setBounds(10, 82, 163, 30);
		contentPane.add(lblPattern);

		txtLetter = new JTextField();
		txtLetter.setFont(new Font("Tahoma", Font.PLAIN, 14));
		txtLetter.setBounds(130, 128, 52, 30);
		contentPane.add(txtLetter);
		txtLetter.setColumns(10);

		btnNewGuess = new JButton("\u041D\u043E\u0432 \u043E\u043F\u0438\u0442:");
		btnNewGuess.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
                
				String key = txtLetter.getText();
				txtLetter.setText("");

				Boolean found = false;
				
                // заместване на _ в шаблона за познатата буквата  
				for (int i = 0; i < word.length; i++) {
					if (key.equals(word[i])) {
						pattern[i] = word[i];
						correct++;
						found = true;
						break;
					}
				}

				if (found) {
					 // ако въведената буква  се среща в  "намислената" дума 
					String messagePattern = "";
					for (int i = 0; i < pattern.length; i++) {
						messagePattern += pattern[i] + " ";

					}

					lblPattern.setText(messagePattern);

					if (correct == pattern.length) {
						btnNewGuess.setEnabled(false);
						lblWrongLetters.setText("Позна!");
						JOptionPane.showMessageDialog(null, "Думата е " + correctWord);
					}
				} else {
					 // ако въведената буква не се среща в  "намислената" дума 
					errors++;
					String messageLives = String.format("Грешки (%d):", errors);
					lblLives.setText(messageLives);
					wrongLetters += " " + key;
					lblWrongLetters.setText(wrongLetters);
					if (errors == MAX_LIVES) {
						btnNewGuess.setEnabled(false);
						lblWrongLetters.setText("Край на играта!");
						JOptionPane.showMessageDialog(null, "Думата е " + correctWord);
					}
				}
			}
		});
		btnNewGuess.setFont(new Font("Tahoma", Font.PLAIN, 14));
		btnNewGuess.setBounds(10, 123, 100, 38);
		contentPane.add(btnNewGuess);

		comboBox = new JComboBox<String>();
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				int choice = (int) comboBox.getSelectedIndex();
							
                // инициализиране на масива на "намислената" дума според избрания тип
				if (choice == 1) {
					word = town;

				} else if (choice == 2) {
					word = animal;

				} else if (choice == 3) {
					word = informatics;

				}

				// дефиниране и създаване на масива на шаблона на "намислената" дума
				pattern = new String[word.length];
				
				// "Изчистване" на стойностите на всички променливи за новата игра
				correctWord = "";
				errors = 0;
				wrongLetters = "";
				correct = 0;
				String messagePattern = "";
				
				
				// инициализиране на стойностите на масива на шаблона на "намислената" дума
				// и на съобщенията за потребителя
				for (int i = 0; i < pattern.length; i++) {
					pattern[i] = "_";
					messagePattern += pattern[i] + " ";
					correctWord += word[i];
				}

				lblPattern.setText(messagePattern);

				btnNewGuess.setEnabled(true);

				String messageLives = String.format("Грешки (%d):", errors);

				lblLives.setText(messageLives);
				lblWrongLetters.setText(wrongLetters);

			}

		});
		comboBox.setFont(new Font("Tahoma", Font.BOLD, 14));
		comboBox.setModel(new DefaultComboBoxModel<String>(new String[] {" ", "\u0433\u0440\u0430\u0434\u043E\u0432\u0435", "\u0436\u0438\u0432\u043E\u0442\u043D\u0438", "\u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430"}));
		comboBox.setBounds(10, 11, 145, 49);
		contentPane.add(comboBox);

		lblWrongLetters = new JLabel("");
		lblWrongLetters.setForeground(Color.RED);
		lblWrongLetters.setFont(new Font("Tahoma", Font.BOLD, 14));
		lblWrongLetters.setBounds(111, 183, 157, 30);
		contentPane.add(lblWrongLetters);
	}
}
