package com.github.reugn.devtools.controllers;

import com.github.reugn.devtools.utils.Elements;
import com.github.reugn.devtools.utils.Logger;
import com.github.reugn.devtools.utils.PasswordGenerator;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.control.*;
import javafx.scene.layout.Border;
import javafx.scene.layout.VBox;

import java.net.URL;
import java.security.InvalidParameterException;
import java.util.ResourceBundle;
import java.util.UUID;

public class GeneratorController implements Initializable, Logger {

    @FXML
    private ComboBox<Integer> uuidAmount;
    @FXML
    private Label uuidAmountLabel;
    @FXML
    private CheckBox uuidUpperCase;
    @FXML
    private CheckBox uuidHyphens;
    @FXML
    private TextArea generatorResult;
    @FXML
    private CheckBox pwdLowChars;
    @FXML
    private CheckBox pwdDigits;
    @FXML
    private CheckBox pwdUpperChars;
    @FXML
    private CheckBox pwdSymbols;
    @FXML
    private TextField pwdLength;
    @FXML
    private Label pwdLengthLabel;
    @FXML
    private Button clearButton;

    @FXML
    private void handleGenerateUUIDAction(final ActionEvent event) {
        StringBuilder buff = new StringBuilder();
        Integer amount = uuidAmount.getValue();
        for (int i = 0; i < amount; i++) {
            String uuid = UUID.randomUUID().toString();
            if (uuidUpperCase.isSelected()) {
                uuid = uuid.toUpperCase();
            }
            if (!uuidHyphens.isSelected()) {
                uuid = uuid.replace("-", "");
            }
            buff.append(uuid).append("\n");
        }
        generatorResult.setText(buff.toString());
    }

    @FXML
    private void handleGeneratePasswordAction(final ActionEvent actionEvent) {
        int length;
        try {
            pwdLength.setBorder(Border.EMPTY);
            length = validatePasswordLength();
        } catch (Exception e) {
            pwdLength.setBorder(Elements.alertBorder);
            return;
        }
        PasswordGenerator generator = new PasswordGenerator.PasswordGeneratorBuilder()
                .withLowerChars(pwdLowChars.isSelected())
                .withDigits(pwdDigits.isSelected())
                .withUpperChars(pwdUpperChars.isSelected())
                .withSymbols(pwdSymbols.isSelected())
                .build();
        generatorResult.setText(generator.generate(length));
    }

    private int validatePasswordLength() throws Exception {
        int length = Integer.parseInt(pwdLength.getText());
        if (length < 1) throw new InvalidParameterException("Invalid password length");
        return length;
    }

    @FXML
    private void handleClearResult(final ActionEvent actionEvent) {
        generatorResult.setText("");
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        uuidAmount.getItems().setAll(1, 2, 3, 5, 10, 20, 50, 100);
        uuidAmount.setValue(1);
        uuidAmountLabel.setPadding(new Insets(5));
        pwdLengthLabel.setPadding(new Insets(5));
        VBox.setMargin(clearButton, new Insets(5, 0, 0, 0));
        pwdLength.setPrefWidth(64);
        pwdLength.setText("16");

        pwdLowChars.setSelected(true);
        pwdDigits.setSelected(true);
    }
}