/*
 * 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.advertisement;

import java.io.Serializable;

import org.aegee.runanddine.BasePage;
import org.aegee.runanddine.RunAndDineApplication;
import org.aegee.runanddine.util.forms.DynamicForm;
import org.aegee.runanddine.util.forms.FurtherReadingHeadline;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.validation.validator.EmailAddressValidator;

/**
 * Manager page for advertising
 * @author s_wolff
 */
public class AdvertisementManager extends BasePage {

    /**
     * Page constructor
     * @param parameters HTTP parameters 
     */
    public AdvertisementManager(PageParameters parameters) {
        super(parameters);

        final MailingList nml = new MailingList();
        final MailingListContainer dml = new MailingListContainer();
        final AdvertisementMailTemplate t = AdvertisementMailTemplate.getTemplate();

        /*
         * Form for new mailing lists
         */
        DynamicForm newMailingListForm = new DynamicForm("newMailForm") {

            @Override
            protected void onSubmit() {
                super.onSubmit();
                MailingList.OBJECTS.save(nml);
                this.setResponsePage(AdvertisementManager.class); // this clears the input
            }
        };
        newMailingListForm.addHeadline("Add new Mailing List");
        newMailingListForm.addTextField(nml, "name", "Name", true);
        newMailingListForm.addTextField(nml, "address", "eMail", true).addInputBehaviour(EmailAddressValidator.getInstance());
        newMailingListForm.addSubmitButton("Add new Mailing List");
        this.add(newMailingListForm);


        /*
         * Form for deleting existing mailing lists
         */
        final DynamicForm deleteMailingListForm = new DynamicForm("deleteMailForm") {

            @Override
            protected void onSubmit() {
                super.onSubmit();
                MailingList.OBJECTS.delete(dml.toDelete);
                this.setResponsePage(AdvertisementManager.class);
            }
        };
        deleteMailingListForm.addHeadline("Delete Mailing List");
        deleteMailingListForm.addSelection(dml, MailingList.OBJECTS.getAll(), "toDelete", "Select Mailing List", true);
        deleteMailingListForm.addSubmitButton("Delete Mailing List");
        this.add(deleteMailingListForm);


        /*
         * Form for editing the mail template
         */
        DynamicForm templateForm = new DynamicForm("templateForm") {

            @Override
            protected void onSubmit() {
                super.onSubmit();
                t.saveTemplate();
            }
        };
        Link howTo = BasePage.createHowToWriteAnAbstractMailPopup(FurtherReadingHeadline.ID_LINK, AdvertisementMailRenderer.getRenderableKeys());
        templateForm.addFurtherReadingHeadline("Change Mail Template", "You might want to read this Tutorial about how to write an abstract Mail", howTo);
        templateForm.addTextField(t, "subject", "Subject", true);
        templateForm.addTextArea(t, "content", "Content", true, 20);
        templateForm.addSubmitButton("Change Template");
        this.add(templateForm);
    }

    /**
     * Container for MailingLists
     */
    private class MailingListContainer implements Serializable {

        /**
         * Deletion flag
         */
        private MailingList toDelete;

        /**
         * Get deletion flag
         * @return 
         */
        public MailingList getToDelete() {
            return toDelete;
        }

        /**
         * Set deletion flag
         * @param toDelete 
         */
        public void setToDelete(MailingList toDelete) {
            this.toDelete = toDelete;
        }
    }
}
