/*
 * 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.wicket.examples.hangman;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
 * The main guess page for the hangman application.
 * 
 * @author Chris Turner
 * @author Jonathan Locke
 */
public class Guess extends HangmanPage
{
    /**
     * Create the guess page.
     */
    public Guess()
    {
        // Components for displaying the guesses remaining & the hangman
        add(new Label("guessesRemaining", new PropertyModel<>(getGame(), "guessesRemaining")));

        // Components for displaying the current word
        add(new Label("word", () -> getGame().getWord().asString(true)));

        // Show the game's letters
        add(new ListView<Letter>("letters", getGame().getLetters())
        {
            @Override
            protected void populateItem(final ListItem<Letter> listItem)
            {
                final Letter letter = listItem.getModelObject();
                final Link<Void> link = new Link<Void>("letter")
                {
                    @Override
                    protected void onBeforeRender()
                    {
                        super.onBeforeRender();
                        // Set enable state of link
                        setAutoEnable(false);
                        setEnabled(!letter.isGuessed());
                    }

                    @Override
                    public void onClick()
                    {
                        // Guess the letter
                        getGame().guess(letter);

                        // Is the game over?
                        if (getGame().isWon())
                        {
                            // Redirect to win page
                            setResponsePage(new Win());
                        }
                        else if (getGame().isLost())
                        {
                            // Redirect to lose page
                            setResponsePage(new Lose());
                        }
                        else
                        {
                            // Return to guess page with new state to display
                        }
                    }
                };

                PageParameters parameters = new PageParameters();
                parameters.set(Letter.PARAMETER_LETTER, letter.asString());
                if (letter.isGuessed())
                {
                    parameters.set(Letter.PARAMETER_GUESSED, true);
                }
                link.add(new Image("image", Letter.LETTER_RESOURCE_REFERENCE, parameters));
                listItem.add(link);

                // append id attribute to link for unit tests
                link.add(AttributeModifier.replace("id", "letter_" + letter.asString()));
            }
        });
    }
}