/*
 * Copyright 2012 s_wolff.
 *
 * Licensed 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.aegee.runanddine.pathfinder.groupbuilding;

import java.util.Collection;

import org.aegee.runanddine.BasePage;
import org.aegee.runanddine.pathfinder.optimizers.OptGroupBuilder;
import org.aegee.runanddine.registration.*;
import org.aegee.runanddine.runanddine.RunAndDine;
import org.aegee.runanddine.status.RunAndDineStatus;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
 *
 * @author s_wolff
 */
public class GroupBuilderOverviewPage extends BasePage {

    public GroupBuilderOverviewPage(final RunAndDine event) {
        super(null);

        Collection<SingleRegistration> singleRegs = SingleRegistration.OBJECTS.getAllValidatedByRunAndDineId(event.getId());
        Collection<GroupRegistration> groupRegs = GroupRegistration.OBJECTS.getAllValidatedByRunAndDineId(event.getId());

        this.add(new Label("numSingle", "" + singleRegs.size()));
        this.add(new Label("numGroup", "" + groupRegs.size()));

        WebMarkupContainer errorUnevenWrapper = new WebMarkupContainer("error_uneven");
        errorUnevenWrapper.add(new Link("newSingle1") {

            @Override
            public void onClick() {
                this.setResponsePage(new SingleRegistrationEditor(new PageParameters().add("new", "true").add("id", event.getId())));
            }
        });
        errorUnevenWrapper.setVisible(singleRegs.size() % 2 == 1);
        this.add(errorUnevenWrapper);

        int numOptGroups = singleRegs.size() / 2 + groupRegs.size();
        WebMarkupContainer errorWrapper = new WebMarkupContainer("error_missing");
        errorWrapper.setVisible(numOptGroups % 3 != 0);
        errorWrapper.add(new Label("missingNum", "" + (3 - numOptGroups % 3) * 2));
        errorWrapper.add(new Link("newSingle2") {

            @Override
            public void onClick() {
                this.setResponsePage(new SingleRegistrationEditor(new PageParameters().add("new", "true").add("id", event.getId())));
            }
        });
        errorWrapper.add(new Link("newGroup") {

            @Override
            public void onClick() {
                this.setResponsePage(new GroupRegistrationEditor(new PageParameters().add("new", "true").add("id", event.getId())));
            }
        });
        errorWrapper.add(new Link("goToPM") {

            @Override
            public void onClick() {
                this.setResponsePage(new ParticipantManager(event));
            }
        });
        this.add(errorWrapper);

        boolean goOn = numOptGroups % 3 == 0 && singleRegs.size() % 2 == 0;
        WebMarkupContainer successWrapper = new WebMarkupContainer("succ");
        successWrapper.setVisible(goOn);
        successWrapper.add(new Label("numOpt", "" + numOptGroups));
        this.add(successWrapper);

        successWrapper.add(new FeedbackPanel("feedback"));

        successWrapper.add(new Link("build") {

            @Override
            public void onClick() {
                try {
                    RunAndDineStatus.setStatusInformation(event.getId(), GroupBuilderOverviewPage.class, "Creating proposal...");
                    OptGroupBuilder.makeAndSaveOptGroups(event);
                    RunAndDineStatus.setStatusInformation(event.getId(), GroupBuilderOverviewPage.class, "Proposal successfully created.");
                    this.setResponsePage(new GroupManager(event));
                } catch (OptGroupBuilder.ToFewKitchenException e) {
                    RunAndDineStatus.setStatusInformation(event.getId(), GroupBuilderOverviewPage.class, "Proposal generation failed.");
                    GroupBuilderOverviewPage.this.error("There are to less kitchens! At least every second SingleRegistration needs a kitchen!");
                } catch (OptGroupBuilder.UnevenNumberOfGroupsException e) {
                    RunAndDineStatus.setStatusInformation(event.getId(), GroupBuilderOverviewPage.class, "Proposal generation failed.");
                    GroupBuilderOverviewPage.this.error("There is an uneven number of single registrations. Please add or remove one.");
                }
            }
        });
    }
}
