/*
 * 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.editors.layout.configuration;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.ide.common.resources.ResourceRepository;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
import com.android.resources.ResourceType;
import com.android.sdklib.IAndroidTarget;

import java.util.Map;

/**
 * Interface implemented by clients who embed a {@link ConfigurationChooser}.
 */
public interface ConfigurationClient {
    /**
     * The configuration is about to be changed.
     *
     * @param flags details about what changed; consult the {@code CFG_} flags
     *            in {@link Configuration} such as
     *            {@link Configuration#CFG_DEVICE},
     *            {@link Configuration#CFG_LOCALE}, etc.
     */
    void aboutToChange(int flags);

    /**
     * The configuration has changed. If the client returns false, it means that
     * the change was rejected. This typically means that changing the
     * configuration in this particular way makes a configuration which has a
     * better file match than the current client's file, so it will open that
     * file to edit the new configuration -- and the current configuration
     * should go back to editing the state prior to this change.
     *
     * @param flags details about what changed; consult the {@code CFG_} flags
     *            such as {@link Configuration#CFG_DEVICE},
     *            {@link Configuration#CFG_LOCALE}, etc.
     * @return true if the change was accepted, false if it was rejected.
     */
    boolean changed(int flags);

    /**
     * Compute the project resources
     *
     * @return the project resources as a {@link ResourceRepository}
     */
    @Nullable
    ResourceRepository getProjectResources();

    /**
     * Compute the framework resources
     *
     * @return the project resources as a {@link ResourceRepository}
     */
    @Nullable
    ResourceRepository getFrameworkResources();

    /**
     * Compute the framework resources for the given Android API target
     *
     * @param target the target to look up framework resources for
     * @return the project resources as a {@link ResourceRepository}
     */
    @Nullable
    ResourceRepository getFrameworkResources(@Nullable IAndroidTarget target);

    /**
     * Returns the configured project resources for the current file and
     * configuration
     *
     * @return resource type maps to names to resource values
     */
    @NonNull
    Map<ResourceType, Map<String, ResourceValue>> getConfiguredProjectResources();

    /**
     * Returns the configured framework resources for the current file and
     * configuration
     *
     * @return resource type maps to names to resource values
     */
    @NonNull
    Map<ResourceType, Map<String, ResourceValue>> getConfiguredFrameworkResources();

    /**
     * If the current layout is an included layout rendered within an outer layout,
     * returns the outer layout.
     *
     * @return the outer including layout, or null
     */
    @Nullable
    Reference getIncludedWithin();

    /**
     * Called when the "Create" button is clicked.
     */
    void createConfigFile();

    /**
     * Called when an associated activity is picked
     *
     * @param fqcn the fully qualified class name for the associated activity context
     */
    void setActivity(@NonNull String fqcn);

    /**
     * Returns the associated layout canvas, if any
     *
     * @return the canvas, if any
     */
    @Nullable
    LayoutCanvas getCanvas();
}
