/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
 *
 * 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 com.android.ide.eclipse.adt.internal.wizards.templates;

import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.CATEGORY_PROJECTS;

import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
import com.android.sdklib.IAndroidTarget;

import org.eclipse.ui.IWorkingSet;

import java.util.HashMap;
import java.util.Map;

/**
 * Value object which holds the current state of the wizard pages for the
 * {@link NewProjectWizard}
 */
public class NewProjectWizardState {
    /** Creates a new {@link NewProjectWizardState} */
    public NewProjectWizardState() {
        template = TemplateHandler.createFromName(CATEGORY_PROJECTS,
                "NewAndroidApplication"); //$NON-NLS-1$
    }

    /** The template handler instantiating the project */
    public final TemplateHandler template;

    /** The name of the project */
    public String projectName;

    /** The derived name of the activity, if any */
    public String activityName;

    /** The derived title of the activity, if any */
    public String activityTitle;

    /** The application name */
    public String applicationName;

    /** The package name */
    public String packageName;

    /** Whether the project name has been edited by the user */
    public boolean projectModified;

    /** Whether the package name has been edited by the user */
    public boolean packageModified;

    /** Whether the activity name has been edited by the user */
    public boolean activityNameModified;

    /** Whether the activity title has been edited by the user */
    public boolean activityTitleModified;

    /** Whether the application name has been edited by the user */
    public boolean applicationModified;

    /** The compilation target to use for this project */
    public IAndroidTarget target;

    /** The minimum SDK API level, as a string (if the API is a preview release with a codename) */
    public String minSdk;

    /** The minimum SDK API level to use */
    public int minSdkLevel;

    /** The target SDK level */
    public int targetSdkLevel = AdtUtils.getHighestKnownApiLevel();

    /** Whether this project should be marked as a library project */
    public boolean isLibrary;

    /** Whether to create an activity (if so, the activity state is stored in
     * {@link #activityValues}) */
    public boolean createActivity = true;

    /** Whether a custom icon should be created instead of just reusing the default (if so,
     * the icon wizard state is stored in {@link #iconState}) */
    public boolean createIcon = true;

    // Delegated wizards

    /** State for the asset studio wizard, used to create custom icons */
    public CreateAssetSetWizardState iconState = new CreateAssetSetWizardState();

    /** State for the template wizard, used to embed an activity template */
    public NewTemplateWizardState activityValues = new NewTemplateWizardState();

    /** Whether a custom location should be used */
    public boolean useDefaultLocation = true;

    /** Folder where the project should be created. */
    public String projectLocation;

    /** Configured parameters, by id */
    public final Map<String, Object> parameters = new HashMap<String, Object>();

    /** The set of chosen working sets to use when creating the project */
    public IWorkingSet[] workingSets = new IWorkingSet[0];

    /**
     * Returns the build target API level
     *
     * @return the build target API level
     */
    public int getBuildApi() {
        return target != null ? target.getVersion().getApiLevel() : minSdkLevel;
    }
}
