/*****************************************************************
 *   Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 ****************************************************************/

package org.apache.cayenne.modeler.layout;

import java.io.IOException;

import org.apache.cayenne.modeler.adapters.DataNodeAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javafx.fxml.FXML;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;

public class DataNodePasswordEncoderTabLayout
    extends AbstractViewLayout
    implements DetailEditorSupport<DataNodeAdapter>
{
    private static final Logger LOGGER = LoggerFactory.getLogger(DataNodePasswordEncoderTabLayout.class);

    @FXML
    private ComboBox<String> passwordEncoderComboBox;

    @FXML
    private ChoiceBox<String> passwordLocationChoiceBox;

    @FXML
    private GridPane passwordSourceGridPane, passwordFilenameGridPane, passwordExecutableGridPane, passwordUrlGridPane;

    @FXML
    private TextField passwordSourceTextField, passwordFilenameTextField, passwordExecutableTextField, passwordUrlTextField;

    private DataNodeAdapter dataNodeAdapter;

    private final String passwordEncoderPlainTextSetting = "org.apache.cayenne.configuration.PlainTextPasswordEncoder";
    private final String passwordEncoderRot13Setting     = "org.apache.cayenne.configuration.Rot13PasswordEncoder";
    private final String passwordEncoderRot47Setting     = "org.apache.cayenne.configuration.Rot47PasswordEncoder";

    private final String passwordLocationModelSetting      = "Cayenne Model";
    private final String passwordLocationClasspathSetting  = "Java CLASSPATH Search (File System)";
    private final String passwordLocationExecutableSetting = "Executable Program";
    private final String passwordLocationUrlSetting        = "URL (file:, https:, etc.)";


    public DataNodePasswordEncoderTabLayout(final MainWindowSupport parentComponent) throws IOException
    {
        super(parentComponent, "/layouts/DataNodePasswordEncoderTabLayout.fxml");
    }

    @Override
    public void initializeLayout()
    {
        super.initializeLayout();

        passwordEncoderComboBox.getItems().add(passwordEncoderPlainTextSetting);
        passwordEncoderComboBox.getItems().add(passwordEncoderRot13Setting);
        passwordEncoderComboBox.getItems().add(passwordEncoderRot47Setting);

        passwordEncoderComboBox.getSelectionModel().select(0);

        passwordLocationChoiceBox.getItems().add(passwordLocationModelSetting);
        passwordLocationChoiceBox.getItems().add(passwordLocationClasspathSetting);
        passwordLocationChoiceBox.getItems().add(passwordLocationExecutableSetting);
        passwordLocationChoiceBox.getItems().add(passwordLocationUrlSetting);

        passwordLocationChoiceBox.valueProperty().addListener((observable, oldValue, newValue) ->
        {
            final boolean model      = newValue.equals(passwordLocationModelSetting);
            final boolean classpath  = newValue.equals(passwordLocationClasspathSetting);
            final boolean executable = newValue.equals(passwordLocationExecutableSetting);
            final boolean url        = newValue.equals(passwordLocationUrlSetting);

            setVisibility(passwordSourceGridPane, model);
            setVisibility(passwordFilenameGridPane, classpath);
            setVisibility(passwordExecutableGridPane, executable);
            setVisibility(passwordUrlGridPane, url);
        });

        passwordLocationChoiceBox.getSelectionModel().select(0);
    }

//    public void tabChanged(final Event event)
//    {
//        LOGGER.debug("event: " + event);
//        getMainWindow().getCayenneProject().getDataMaps();
//    }

    @Override
    public void setPropertyAdapter(final DataNodeAdapter dataNodeAdapter)
    {
        this.dataNodeAdapter = dataNodeAdapter;
    }

//    @Override
//    public void beginEditing()
//    {
//    }
//
//    @Override
//    public void endEditing()
//    {
//    }
}
