package edu.school.safe;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import javax.swing.UIManager;
import javax.swing.SpringLayout;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**
 * Информатика, 8 клас, издателство Просвета, 2017 
 * Автори: Светла Бойчева, Николина Николова, Елиза Стефанова, Антон Денев 
 * Урок 3.4.1.1. Цикъл, управляван от условие 
 * Задача: Сейф за ценности се заключва чрез въвеждане на 6-цифрен код. 
 * За валидни се приемат кодове, които съдържат както четни, така и нечетни цифри. 
 * В противен случай сейфът не се заключва.
 * Да се създаде приложение Safe, което проверява дали дадена последова-телност от цифри
 * е валиден код за сейфа.
 * 
 * Вариант 1.
 */
public class SafeForm extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JTextField txtCode;

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

	/**
	 * Create the frame.
	 */
	public SafeForm() {
		setTitle("\u0421\u0435\u0439\u0444");
		setFont(new Font("Dialog", Font.PLAIN, 14));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 290, 300);
		contentPane = new JPanel();
		contentPane.setBackground(UIManager.getColor("Panel.background"));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		SpringLayout sl_contentPane = new SpringLayout();
		contentPane.setLayout(sl_contentPane);

		JLabel lblCode = new JLabel("\u041A\u043E\u0434:");
		sl_contentPane.putConstraint(SpringLayout.NORTH, lblCode, 10, SpringLayout.NORTH, contentPane);
		sl_contentPane.putConstraint(SpringLayout.WEST, lblCode, 10, SpringLayout.WEST, contentPane);
		sl_contentPane.putConstraint(SpringLayout.SOUTH, lblCode, 34, SpringLayout.NORTH, contentPane);
		sl_contentPane.putConstraint(SpringLayout.EAST, lblCode, 62, SpringLayout.WEST, contentPane);
		lblCode.setForeground(new Color(0, 102, 102));
		lblCode.setFont(new Font("Tahoma", Font.PLAIN, 14));
		contentPane.add(lblCode);

		txtCode = new JTextField();
		sl_contentPane.putConstraint(SpringLayout.NORTH, txtCode, 3, SpringLayout.NORTH, lblCode);
		sl_contentPane.putConstraint(SpringLayout.WEST, txtCode, 11, SpringLayout.EAST, lblCode);
		txtCode.setBorder(new LineBorder(new Color(51, 102, 102), 1, true));
		txtCode.setFont(new Font("Tahoma", Font.PLAIN, 14));
		contentPane.add(txtCode);
		txtCode.setColumns(6);

		JLabel lblResult = new JLabel("\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442:");
		sl_contentPane.putConstraint(SpringLayout.NORTH, lblResult, 27, SpringLayout.SOUTH, lblCode);
		sl_contentPane.putConstraint(SpringLayout.WEST, lblResult, 0, SpringLayout.WEST, lblCode);
		lblResult.setForeground(new Color(0, 102, 102));
		lblResult.setFont(new Font("Tahoma", Font.PLAIN, 14));
		contentPane.add(lblResult);

		JTextArea txaResult = new JTextArea();
		txaResult.setEditable(false);
		sl_contentPane.putConstraint(SpringLayout.EAST, txtCode, 0, SpringLayout.EAST, txaResult);
		sl_contentPane.putConstraint(SpringLayout.NORTH, txaResult, 11, SpringLayout.SOUTH, lblResult);
		sl_contentPane.putConstraint(SpringLayout.WEST, txaResult, 15, SpringLayout.WEST, contentPane);
		sl_contentPane.putConstraint(SpringLayout.SOUTH, txaResult, 108, SpringLayout.SOUTH, lblResult);
		sl_contentPane.putConstraint(SpringLayout.EAST, txaResult, -16, SpringLayout.EAST, contentPane);
		txaResult.setBorder(new LineBorder(new Color(51, 102, 102), 1, true));
		contentPane.add(txaResult);

		JButton btnExit = new JButton("\u0418\u0437\u0445\u043E\u0434");
		btnExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		sl_contentPane.putConstraint(SpringLayout.SOUTH, btnExit, -10, SpringLayout.SOUTH, contentPane);
		sl_contentPane.putConstraint(SpringLayout.EAST, btnExit, 0, SpringLayout.EAST, txaResult);
		contentPane.add(btnExit);

		JButton btnReset = new JButton("\u0418\u0437\u0447\u0438\u0441\u0442\u0438");
		btnReset.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				txtCode.setText("");
				txaResult.setText("");
			}
		});
		sl_contentPane.putConstraint(SpringLayout.SOUTH, btnReset, 0, SpringLayout.SOUTH, btnExit);
		sl_contentPane.putConstraint(SpringLayout.EAST, btnReset, -6, SpringLayout.WEST, btnExit);
		contentPane.add(btnReset);

		JButton btnCheck = new JButton("\u041F\u0440\u043E\u0432\u0435\u0440\u0438");
		btnCheck.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// Проверка за празно поле
				String strCode = txtCode.getText();
				if (strCode.isEmpty()) {
					JOptionPane.showMessageDialog(null, "Въведете код!");
					txtCode.setText("");
					txtCode.grabFocus();
				}

				// Съобщението, което ще се изведе накрая
				String message = "";

				// Проверка за брой цифри
				// Кодът, въведен от потребителя
				int code = Integer.parseInt(txtCode.getText());

				// Очакван брой цифри
				final int EXPECTED_NUMBER_OF_DIGITS = 6;

				// Брой цифри
				// В началото не са отброени цифри
				int count = 0;
				do {
					// Преброяване на цифра
					count++;
					// Премахване на последната цифра
					code /= 10;
				} while (code > 0);

				// 'истина', ако цифрите са точно 6
				boolean has6Digits = count == EXPECTED_NUMBER_OF_DIGITS;

				// Проверка за четна цифра
				code = Integer.parseInt(txtCode.getText());

				int digit; // поредна цифра
				do {
					digit = code % 10;
					code /= 10;
				} while ((code > 0) && (digit % 2 != 0));
				// От цикъла се излиза при изчерпване на цифрите
				// ИЛИ достигане на четна цифра

				boolean hasEvenDigit = digit % 2 == 0;

				// Проверка за нечетна цифра
				code = Integer.parseInt(txtCode.getText());

				do {
					digit = code % 10;
					code /= 10;
				} while ((code > 0) && (digit % 2 == 0));
				// От цикъла се излиза при изчерпване на цифрите
				// ИЛИ достихане на нечетна цифра

				boolean hasOddDigit = digit % 2 != 0;

				boolean isValid = has6Digits && hasEvenDigit && hasOddDigit;

				if (isValid) {
					message += "Кодът е валиден!";
				} else {
					if (!has6Digits) {
						message += "Въведете точно 6 цифри!\n";
					}
					if (!hasEvenDigit) {
						message += "Няма четна цифра!";
					}
					if (!hasOddDigit) {
						message += "Няма нечетна цифра!";
					}

				}

				txaResult.setText(message);
			}
		});
		sl_contentPane.putConstraint(SpringLayout.NORTH, btnCheck, 0, SpringLayout.NORTH, btnExit);
		sl_contentPane.putConstraint(SpringLayout.EAST, btnCheck, -6, SpringLayout.WEST, btnReset);
		contentPane.add(btnCheck);
	}
}
