/*
 * #%L
 * OAuth Tool
 * %%
 * Copyright (C) 2009 - 2013 The Sakai Foundation
 * %%
 * Licensed under the Educational Community 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://opensource.org/licenses/ecl2
 * 
 * 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.
 * #L%
 */
package org.sakaiproject.oauth.tool.admin.pages;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.sakaiproject.authz.api.FunctionManager;
import org.sakaiproject.oauth.domain.Consumer;
import org.sakaiproject.oauth.service.OAuthAdminService;
import org.sakaiproject.oauth.tool.pages.SakaiPage;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;

/**
 * @author Colin Hebert
 */
public class ConsumerAdministration extends SakaiPage {
    private final Consumer consumer;
    @SpringBean
    private FunctionManager functionManager;
    @SpringBean
    private OAuthAdminService oAuthAdminService;

    public ConsumerAdministration() {
        consumer = new Consumer();
        // Manually set an empty Set for rights to avoid confusion with CheckBoxMultipleChoice
        // and not ending up with a List
        consumer.setRights(new HashSet<String>());
        init(false);
    }

    public ConsumerAdministration(PageParameters parameters) {
        super(parameters);
        String consumerId = parameters.get("consumer").toString();
        consumer = oAuthAdminService.getConsumer(consumerId);
        init(true);
    }

    private void init(final boolean edit) {
        addMenuLink(ListConsumers.class, new ResourceModel("menu.list.consumer"), null);
        addMenuLink(ConsumerAdministration.class, new ResourceModel("menu.add.consumer"), null);

        Form consumerForm = new Form<Void>("consumerForm") {
            @Override
            protected void onSubmit() {
                super.onSubmit();
                try {
                    if (edit)
                        oAuthAdminService.updateConsumer(consumer);
                    else
                        oAuthAdminService.createConsumer(consumer);
                    setResponsePage(ListConsumers.class);
                    getSession().info(consumer.getName() + " has been saved.");
                } catch (Exception e) {
                    error("Couldn't update '" + consumer.getName() + "': " + e.getLocalizedMessage());
                }
            }
        };

        TextField<String> idTextField;
        if (edit) {
            idTextField = new TextField<String>("id");
            idTextField.add(new AttributeModifier("disabled", "disabled"));
            idTextField.setModel(Model.of(consumer.getId()));
        } else {
            idTextField = new RequiredTextField<String>("id", new PropertyModel<String>(consumer, "id"));
        }
        consumerForm.add(idTextField);

        consumerForm.add(new RequiredTextField<String>("name", new PropertyModel<String>(consumer, "name")));
        consumerForm.add(new TextArea<String>("description", new PropertyModel<String>(consumer, "description")));
        consumerForm.add(new TextField<String>("url", new PropertyModel<String>(consumer, "url")));
        consumerForm.add(new TextField<String>("callbackUrl", new PropertyModel<String>(consumer, "callbackUrl")));
        consumerForm.add(new RequiredTextField<String>("secret", new PropertyModel<String>(consumer, "secret")));
        consumerForm.add(new TextField<String>("accessorSecret",
                new PropertyModel<String>(consumer, "accessorSecret")));
        consumerForm.add(new TextField<Integer>("defaultValidity",
                new PropertyModel<Integer>(consumer, "defaultValidity")));

        // Create a list of possible rights as checkboxes, pre-check already granted permissions
        CheckBoxMultipleChoice<String> rightCheckboxes = new CheckBoxMultipleChoice<String>("rights",
                new PropertyModel<Collection<String>>(consumer, "rights"), getAvailableFunctions());
        consumerForm.add(rightCheckboxes);

        add(new Label("consumerName", consumer.getName()));
        add(consumerForm);
    }

    private List<String> getAvailableFunctions() {
        return functionManager.getRegisteredFunctions();
    }
}