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

import com.android.common.annotations.NonNull;
import com.android.common.annotations.Nullable;
import com.android.common.utils.ILogger;


/**
 * Helper to create {@link com.android.manifmerger.IMergerLog} instances with specific purposes.
 */
public abstract class MergerLog {

    /**
     * Create a new instance of a {@link com.android.manifmerger.MergerLog} that prints to an {@link ILogger}.
     *
     * @param sdkLog A non-null {@link ILogger}.
     * @return A new IMergerLog.
     */
    public static IMergerLog wrapSdkLog(final @NonNull ILogger sdkLog) {
        return new IMergerLog() {
            @Override
            public void error(
                    @NonNull Severity severity,
                    @NonNull FileAndLine location,
                    @NonNull String message,
                    Object...msgParams) {

                switch(severity) {
                case INFO:
                    sdkLog.info(
                            "[%1$s] %2$s",                                  //$NON-NLS-1$
                            location,
                            String.format(message, msgParams));
                    break;
                case WARNING:
                    sdkLog.warning(
                            "[%1$s] %2$s",                                  //$NON-NLS-1$
                            location,
                            String.format(message, msgParams));
                    break;
                case ERROR:
                    sdkLog.error(null /*throwable*/,
                            "[%1$s] %2$s",                                  //$NON-NLS-1$
                            location,
                            String.format(message, msgParams));
                    break;
                }
            }

            @Override
            public void conflict(@NonNull Severity severity,
                    @NonNull FileAndLine location1,
                    @NonNull FileAndLine location2,
                    @NonNull String message,
                    Object...msgParams) {

                switch(severity) {
                case INFO:
                    sdkLog.info(
                            "[%1$s, %2$s] %3$s",                          //$NON-NLS-1$
                            location1,
                            location2,
                            String.format(message, msgParams));
                    break;
                case WARNING:
                    sdkLog.warning(
                            "[%1$s, %2$s] %3$s",                          //$NON-NLS-1$
                            location1,
                            location2,
                            String.format(message, msgParams));
                    break;
                case ERROR:
                    sdkLog.error(null /*throwable*/,
                            "[%1$s, %2$s] %3$s",                          //$NON-NLS-1$
                            location1,
                            location2,
                            String.format(message, msgParams));
                    break;
                }
            };
        };
    }

    /*
     * Creates a new instance of a {@link MergerLog} that wraps another {@link IMergerLog}
     * and overrides the {@link FileAndLine} locations with the arguments specified.
     * <p/>
     * An example of usage would be merging temporary files yet associating the errors
     * with the original files.
     *
     * @param parentLog A non-null IMergerLog to wrap.
     * @param filePath1 The file path to override in location1 (for errors and conflicts).
     * @param filePath2 An optional file path to override in location2 (for conflicts).
     * @return A new IMergerLog.
     */
    public static IMergerLog mergerLogOverrideLocation(
            final @NonNull IMergerLog parentLog,
            final @Nullable String filePath1,
            final @Nullable String... filePath2) {
        return new IMergerLog() {
            @Override
            public void error(
                    @NonNull Severity severity,
                    @NonNull FileAndLine location,
                    @NonNull String message,
                    Object...msgParams) {

                if (filePath1 != null) {
                    location = new FileAndLine(filePath1, location.getLine());
                }

                parentLog.error(severity, location, message, msgParams);
            }

            @Override
            public void conflict(@NonNull Severity severity,
                    @NonNull FileAndLine location1,
                    @NonNull FileAndLine location2,
                    @NonNull String message,
                    Object...msgParams) {

                if (filePath1 != null) {
                    location1 = new FileAndLine(filePath1, location1.getLine());
                }

                if (filePath2 != null && filePath2.length > 0) {
                    location2 = new FileAndLine(filePath2[0], location2.getLine());
                }

                parentLog.conflict(severity, location1, location2, message, msgParams);
            };
        };
    }

}
