package officerbreaker;

import java.awt.Desktop;
import java.io.File;
import javafx.scene.image.Image;
import java.net.URL;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;

public class Controller {

    private final String EXCEL = "xlsx";
    private final String POWERPOINT = "pptx";
    private final String WORD = "docx";

    @FXML
    private AnchorPane anchorPane;

    @FXML
    private Text filePathText;
    private File file;
    private FileChooser fileChooser;
    private String filePath;
    private String fileName;
    private String fileType;

    @FXML
    private ImageView titleImageView;

    @FXML
    private ImageView fileImageView;
    private Image wordImage;
    private Image excelImage;
    private Image powerpointImage;
    private Image progressOnGoing;
    private Image progressFinished;
    
    @FXML
    private Text fileText;

    @FXML
    private Text invalidFileText;
    
    @FXML
    private ImageView progressBarBrowse;

    @FXML
    private ImageView progressBarRemove;

    @FXML
    public void initialize() {
        anchorPane.setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));

        invalidFileText.setVisible(false); 
        progressBarBrowse.setVisible(false);
        progressBarRemove.setVisible(false);
        
        try {
            wordImage = new Image(getClass().getResourceAsStream("img/word.png"));

            powerpointImage = new Image(getClass().getResourceAsStream("img/powerpoint.png"));

            excelImage = new Image(getClass().getResourceAsStream("img/excel.png"));
            
            progressOnGoing = new Image(getClass().getResourceAsStream("img/prog-bar-ongoing.gif"));
          
            progressFinished = new Image(getClass().getResourceAsStream("img/prog-bar-complete.png"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @FXML
    void browsePressed(ActionEvent event) {

        invalidFileText.setVisible(false);
        progressBarBrowse.setVisible(true);
        progressBarBrowse.setImage(progressOnGoing);
        try {
            fileChooser = new FileChooser();
            fileChooser.setTitle("Please Select a File");
            file = fileChooser.showOpenDialog(null);
            filePath = file.toString();
            fileName = file.getName();
            filePathText.setText(filePath);
            fileType = getFileType();

        } catch (Exception e) {
            e.printStackTrace();
        }

        if (fileType != null && isFileSupported()) {
            setScreenByFileType();
        }
    }

    @FXML
    void removePasswordPressed(ActionEvent event) {
        if (file == null) {
            return;
        }
        if (!isFileSupported()) {
            invalidFileText.setVisible(true);
            return;
        }

        try {
            // show progress
            progressBarRemove.setVisible(true);
            progressBarRemove.setImage(progressOnGoing);
            
            FileManipulator manipulator = new FileManipulator(filePath, "./"); // create new object to manipulate the file

            manipulator.extractFile(); // extract XML from file

            XMLParser parser = new XMLParser(manipulator); // create new object to parse the XML

            if (parser.isExistSecurityElement()) // if the file has a password
            {
                parser.removeElementOfSecurity(); // remove hash node from XML file

                parser.writeToXMLFile(); // write to XML the change

                manipulator.insertFile(); // write back to file

                manipulator.removeXMLFile(); // cleans the xml extracted from origin file
                
                fileText.setText(fileFinishedMessage());
                
                progressBarRemove.setImage(progressFinished);
            }
            else // if there is no security element in the xml file, there is no read-only protection on it
            {
                manipulator.removeXMLFile(); // cleans the xml extracted from origin file
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @FXML
    void openCioccolatodorimaURL(ActionEvent event) {
        try {
            Desktop.getDesktop().browse(new URL("https://twitter.com/cioccolato_kun").toURI());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @FXML
    void openNedlirURL(ActionEvent event) {
        try {
            Desktop.getDesktop().browse(new URL("https://github.com/nedlir").toURI());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean isFileSupported() {
        if (fileType.equals(EXCEL) || fileType.equals(WORD) || fileType.equals(POWERPOINT)) {
            return true;
        } else {
            return false;
        }
    }

    private void setScreenByFileType() {
        titleImageView.setVisible(false);
        progressBarBrowse.setVisible(false);

        switch (fileType) {
            case EXCEL:
                fileImageView.setImage(excelImage);
                fileText.setText(fileRecognizedMessage("Excel"));
                break;
            case WORD:
                fileImageView.setImage(wordImage);
                fileText.setText(fileRecognizedMessage("Word"));
                break;
            case POWERPOINT:
                fileImageView.setImage(powerpointImage);
                fileText.setText(fileRecognizedMessage("PowerPoint"));
                break;
            default:
                break;
        }
    }

    private String getFileType() {
        int indexOfLastDot = fileName.lastIndexOf(".");
        if (indexOfLastDot == -1) // dot not found, invalid file
        {
            return null;
        }
        return fileName.substring(indexOfLastDot + 1);
    }

    // Messages on screen
    private String fileRecognizedMessage(String fileType) {
        String messageOnScreen = "Officer Breaker recognized " + "\"" + fileName + "\"" + " as " + fileType + " file.\n\n";
        messageOnScreen = messageOnScreen + "Press \"Remove Password\" to unprotect the file.";
        return messageOnScreen;
    }

    private String fileFinishedMessage() {
        String messageOnScreen = "Yay! Officer Breaker removed the protection from your file!";
        return messageOnScreen;
    }

}
