package org.phoenicis.javafx.components.application.skin;

import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.transformation.FilteredList;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ScrollPane;
import org.phoenicis.javafx.components.application.control.ApplicationSidebar;
import org.phoenicis.javafx.components.application.control.ApplicationSidebarToggleGroup;
import org.phoenicis.javafx.components.common.control.SidebarGroup;
import org.phoenicis.javafx.components.common.skin.ExtendedSidebarSkinBase;
import org.phoenicis.repository.dto.CategoryDTO;

import static org.phoenicis.configuration.localisation.Localisation.tr;

/**
 * The skin for the {@link ApplicationSidebar} component
 */
public class ApplicationSidebarSkin
        extends ExtendedSidebarSkinBase<CategoryDTO, ApplicationSidebar, ApplicationSidebarSkin> {
    /**
     * Constructor
     *
     * @param control The control belonging to the skin
     */
    public ApplicationSidebarSkin(ApplicationSidebar control) {
        super(control);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected ScrollPane createMainContent() {
        return createScrollPane(createSidebarToggleGroup(), createSpacer(), createFilterGroup());
    }

    private ApplicationSidebarToggleGroup createSidebarToggleGroup() {
        final FilteredList<CategoryDTO> filteredCategories = getControl().getItems()
                .filtered(getControl()::filterCategory);

        filteredCategories.predicateProperty().bind(
                Bindings.createObjectBinding(() -> getControl()::filterCategory,
                        getControl().searchTermProperty(),
                        getControl().fuzzySearchRatioProperty(),
                        getControl().operatingSystemProperty(),
                        getControl().containAllOSCompatibleApplicationsProperty(),
                        getControl().containCommercialApplicationsProperty(),
                        getControl().containRequiresPatchApplicationsProperty(),
                        getControl().containTestingApplicationsProperty()));

        final ApplicationSidebarToggleGroup applicationSidebarToggleGroup = new ApplicationSidebarToggleGroup(
                filteredCategories);

        applicationSidebarToggleGroup.setTitle(tr("Categories"));
        getControl().selectedItemProperty().bind(applicationSidebarToggleGroup.selectedElementProperty());

        return applicationSidebarToggleGroup;
    }

    private SidebarGroup<CheckBox> createFilterGroup() {
        final CheckBox testingCheck = createCheckBox(tr("Testing"));
        getControl().containTestingApplicationsProperty().bind(testingCheck.selectedProperty());

        final CheckBox requiresPatchCheck = createCheckBox(tr("Patch required"));
        getControl().containRequiresPatchApplicationsProperty().bind(requiresPatchCheck.selectedProperty());

        final CheckBox commercialCheck = createCheckBox(tr("Commercial"));
        commercialCheck.setSelected(true);
        getControl().containCommercialApplicationsProperty().bind(commercialCheck.selectedProperty());

        final CheckBox operatingSystemCheck = createCheckBox(tr("All Operating Systems"));
        getControl().containAllOSCompatibleApplicationsProperty().bind(operatingSystemCheck.selectedProperty());

        return new SidebarGroup<>(tr("Filters"), FXCollections.observableArrayList(
                testingCheck, requiresPatchCheck, commercialCheck, operatingSystemCheck));
    }
}