/*
 * Copyright (C) 2022 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.wallpaper.effects;

import android.app.WallpaperInfo;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;

/**
 * Utility class to provide methods to generate effects for the wallpaper.
 */
public abstract class EffectsController {
    public static final int ERROR_ORIGINAL_DESTROY_CONTROLLER = -16;
    public static final int ERROR_ORIGINAL_FINISH_ONGOING_SERVICE = -8;
    public static final int ERROR_ORIGINAL_SERVICE_DISCONNECT = -4;
    public static final int ERROR_ORIGINAL_TIME_OUT = -2;

    public static final int RESULT_ORIGINAL_UNKNOWN = -1;
    public static final int RESULT_SUCCESS = 0;
    public static final int RESULT_ERROR_TRY_ANOTHER_PHOTO = 1;
    public static final int RESULT_ERROR_TRY_AGAIN_LATER = 2;
    public static final int RESULT_ERROR_CONTINUE = 4;
    public static final int RESULT_ERROR_DEFAULT =
            RESULT_ERROR_TRY_ANOTHER_PHOTO + RESULT_ERROR_CONTINUE;
    public static final int RESULT_ERROR_DISCONNECT_NO_BUTTON = 8;
    public static final int RESULT_PROBE_SUCCESS = 16;
    public static final int RESULT_PROBE_ERROR = 32;
    public static final int RESULT_SUCCESS_REUSED = 64;
    public static final int RESULT_SUCCESS_WITH_GENERATION_ERROR = 128;
    public static final int RESULT_ERROR_PROBE_SUPPORT_FOREGROUND = 256;
    public static final int RESULT_FOREGROUND_DOWNLOAD_SUCCEEDED = 512;
    public static final int RESULT_FOREGROUND_DOWNLOAD_FAILED = 1024;
    public static final int RESULT_PROBE_FOREGROUND_DOWNLOADING = 2048;

    /**
     * Interface of the Effect enum.
     */
    public interface EffectEnumInterface {
    }

    public enum Effect implements EffectEnumInterface {
        NONE,
        UNKNOWN,
    }

    protected boolean mBound = false;

    /**
     * Call to generate an effect.
     *
     * @param effect the effect type we want to generate.
     * @param image  the image that will have the effect applied.
     */
    public void generateEffect(EffectEnumInterface effect, Uri image) {
    }

    /**
     * Binds the Effects Service.
     */
    public void bindEffectsService() {
    }

    /**
     * Returns true if an effects component is available on the current device
     */
    public boolean areEffectsAvailable() {
        return false;
    }

    /**
     * Returns true if the given {@link WallpaperInfo} corresponds to a wallpaper matching the
     * "Effects" wallpaper.
     */
    public boolean isEffectsWallpaper(@NonNull WallpaperInfo info) {
        return false;
    }

    /**
     * Destroys the controller
     */
    public void destroy() {
    }

    /**
     * If the Effects Service is bound.
     *
     * @return if the Effects Service is bound.
     */
    public boolean isBound() {
        return mBound;
    }

    /**
     * Triggers the effect.
     *
     * @param context the context
     */
    public void triggerEffect(Context context) {
    }

    /** Sets the {@link EffectsServiceListener} to receive updates. */
    public void setListener(EffectsServiceListener listener) {
    }

    /** Removes the listener set via {@link #setListener(EffectsServiceListener)}. */
    public void removeListener() {
    }

    /** Returns true if the effect is expected by this controller. */
    public boolean isTargetEffect(EffectEnumInterface effect) {
        return effect == getTargetEffect();
    }

    /**
     * Interface to listen to different key moments of the connection with the Effects Service.
     */
    public interface EffectsServiceListener {
        /**
         * Called when an effect has finished being processed.
         *
         * @param effect The effect that was generated.
         * @param bundle The data that the Service might have sent to the picker.
         * @param error The error code. if there's an error, value is greater than
         *              zero.
         * @param originalStatusCode The original status code used for metrics logging.
         * @param errorMessage The error message.
         */
        void onEffectFinished(EffectEnumInterface effect, Bundle bundle, int error,
                int originalStatusCode, String errorMessage);
    }

    public EffectEnumInterface getTargetEffect() {
        return Effect.NONE;
    }

    /**
     * Gets whether the effect triggering is successful or not.
     *
     * @return whether the effect triggering is successful or not.
     */
    public boolean isEffectTriggered() {
        return false;
    }

    public String getEffectTitle() {
        return "";
    }

    public String getEffectFailedTitle() {
        return "";
    }

    public String getEffectSubTitle() {
        return "";
    }

    public String getRetryInstruction() {
        return "";
    }

    public String getNoEffectInstruction() {
        return "";
    }

    public Uri getContentUri() {
        return Uri.EMPTY;
    }

    /** */
    public void interruptGenerate(com.android.wallpaper.effects.Effect effect) {}

    /**
     * This initiates the downloading of the ML models for a given effect
     *
     * @param effect The Effect for which we want to download the ML model
     */
    public void startForegroundDownload(com.android.wallpaper.effects.Effect effect){}

    /**
     * Sends the interrupt foreground downloading to effect.
     *
     * @param effect The effect that is being downloaded.
     */
    public void interruptForegroundDownload(com.android.wallpaper.effects.Effect effect) {}
}
