/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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 com.android.build.gradle

import com.android.build.gradle.api.LibraryVariant
import com.android.build.gradle.internal.dsl.BuildTypeDsl
import com.android.build.gradle.internal.dsl.SigningConfigDsl
import com.android.builder.BuilderConstants
import com.android.builder.DefaultBuildType
import com.android.builder.model.SigningConfig
import org.gradle.api.Action
import org.gradle.api.internal.DefaultDomainObjectSet
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.internal.reflect.Instantiator

/**
 * Extension for 'library' project.
 */
public class LibraryExtension extends BaseExtension {

    final DefaultBuildType debug
    final DefaultBuildType release
    final SigningConfig debugSigningConfig

    private final DefaultDomainObjectSet<LibraryVariant> libraryVariantList =
        new DefaultDomainObjectSet<LibraryVariant>(LibraryVariant.class)

    LibraryExtension(BasePlugin plugin, ProjectInternal project, Instantiator instantiator) {
        super(plugin, project, instantiator)

        debugSigningConfig = instantiator.newInstance(SigningConfigDsl.class,
                BuilderConstants.DEBUG)
        debugSigningConfig.initDebug()

        debug = instantiator.newInstance(BuildTypeDsl.class,
                BuilderConstants.DEBUG, project.fileResolver, instantiator)
        debug.init(debugSigningConfig)

        release = instantiator.newInstance(BuildTypeDsl.class,
                BuilderConstants.RELEASE, project.fileResolver, instantiator)
        release.init(null)
    }

    void debug(Action<DefaultBuildType> action) {
        action.execute(debug);
    }

    void release(Action<DefaultBuildType> action) {
        action.execute(release);
    }

    void debugSigningConfig(Action<SigningConfig> action) {
        action.execute(debugSigningConfig)
    }

    public DefaultDomainObjectSet<LibraryVariant> getLibraryVariants() {
        return libraryVariantList
    }

    void addLibraryVariant(LibraryVariant libraryVariant) {
        libraryVariantList.add(libraryVariant)
    }
}
