/*
 * Copyright (C) 2019 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.testing;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;

import androidx.fragment.app.Fragment;

import com.android.wallpaper.compat.WallpaperManagerCompat;
import com.android.wallpaper.model.CategoryProvider;
import com.android.wallpaper.model.WallpaperInfo;
import com.android.wallpaper.module.AlarmManagerWrapper;
import com.android.wallpaper.module.BitmapCropper;
import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
import com.android.wallpaper.module.DefaultLiveWallpaperInfoFactory;
import com.android.wallpaper.module.DrawableLayerResolver;
import com.android.wallpaper.module.ExploreIntentChecker;
import com.android.wallpaper.module.FormFactorChecker;
import com.android.wallpaper.module.CustomizationSections;
import com.android.wallpaper.module.Injector;
import com.android.wallpaper.module.LiveWallpaperInfoFactory;
import com.android.wallpaper.module.LoggingOptInStatusProvider;
import com.android.wallpaper.module.NetworkStatusNotifier;
import com.android.wallpaper.module.PackageStatusNotifier;
import com.android.wallpaper.module.PartnerProvider;
import com.android.wallpaper.module.SystemFeatureChecker;
import com.android.wallpaper.module.UserEventLogger;
import com.android.wallpaper.module.WallpaperPersister;
import com.android.wallpaper.module.WallpaperPreferences;
import com.android.wallpaper.module.WallpaperRefresher;
import com.android.wallpaper.module.WallpaperRotationRefresher;
import com.android.wallpaper.monitor.PerformanceMonitor;
import com.android.wallpaper.network.Requester;
import com.android.wallpaper.picker.ImagePreviewFragment;
import com.android.wallpaper.picker.individual.IndividualPickerFragment;

/**
 * Test implementation of the dependency injector.
 */
public class TestInjector implements Injector {

    private BitmapCropper mBitmapCropper;
    private CategoryProvider mCategoryProvider;
    private PartnerProvider mPartnerProvider;
    private WallpaperPreferences mPrefs;
    private WallpaperPersister mWallpaperPersister;
    private WallpaperRefresher mWallpaperRefresher;
    private Requester mRequester;
    private WallpaperManagerCompat mWallpaperManagerCompat;
    private CurrentWallpaperInfoFactory mCurrentWallpaperInfoFactory;
    private NetworkStatusNotifier mNetworkStatusNotifier;
    private AlarmManagerWrapper mAlarmManagerWrapper;
    private UserEventLogger mUserEventLogger;
    private ExploreIntentChecker mExploreIntentChecker;
    private SystemFeatureChecker mSystemFeatureChecker;
    private FormFactorChecker mFormFactorChecker;
    private WallpaperRotationRefresher mWallpaperRotationRefresher;
    private PerformanceMonitor mPerformanceMonitor;
    private LoggingOptInStatusProvider mLoggingOptInStatusProvider;

    @Override
    public BitmapCropper getBitmapCropper() {
        if (mBitmapCropper == null) {
            mBitmapCropper = new com.android.wallpaper.testing.TestBitmapCropper();
        }
        return mBitmapCropper;
    }

    @Override
    public CategoryProvider getCategoryProvider(Context context) {
        if (mCategoryProvider == null) {
            mCategoryProvider = new TestCategoryProvider();
        }
        return mCategoryProvider;
    }

    @Override
    public PartnerProvider getPartnerProvider(Context context) {
        if (mPartnerProvider == null) {
            mPartnerProvider = new TestPartnerProvider();
        }
        return mPartnerProvider;
    }

    @Override
    public WallpaperPreferences getPreferences(Context context) {
        if (mPrefs == null) {
            mPrefs = new TestWallpaperPreferences();
        }
        return mPrefs;
    }

    @Override
    public WallpaperPersister getWallpaperPersister(Context context) {
        if (mWallpaperPersister == null) {
            mWallpaperPersister = new TestWallpaperPersister(context.getApplicationContext());
        }
        return mWallpaperPersister;
    }

    @Override
    public WallpaperRefresher getWallpaperRefresher(Context context) {
        if (mWallpaperRefresher == null) {
            mWallpaperRefresher = new TestWallpaperRefresher(context.getApplicationContext());
        }
        return mWallpaperRefresher;
    }

    @Override
    public Requester getRequester(Context unused) {
        return null;
    }

    @Override
    public WallpaperManagerCompat getWallpaperManagerCompat(Context context) {
        if (mWallpaperManagerCompat == null) {
            mWallpaperManagerCompat = new com.android.wallpaper.testing.TestWallpaperManagerCompat(
                    context.getApplicationContext());
        }
        return mWallpaperManagerCompat;
    }

    @Override
    public CurrentWallpaperInfoFactory getCurrentWallpaperFactory(Context context) {
        if (mCurrentWallpaperInfoFactory == null) {
            mCurrentWallpaperInfoFactory =
                    new TestCurrentWallpaperInfoFactory(context.getApplicationContext());
        }
        return mCurrentWallpaperInfoFactory;
    }

    @Override
    public LoggingOptInStatusProvider getLoggingOptInStatusProvider(Context context) {
        if (mLoggingOptInStatusProvider == null) {
            mLoggingOptInStatusProvider = new TestLoggingOptInStatusProvider();
        }
        return mLoggingOptInStatusProvider;
    }

    @Override
    public NetworkStatusNotifier getNetworkStatusNotifier(Context context) {
        if (mNetworkStatusNotifier == null) {
            mNetworkStatusNotifier = new TestNetworkStatusNotifier();
        }
        return mNetworkStatusNotifier;
    }

    @Override
    public AlarmManagerWrapper getAlarmManagerWrapper(Context unused) {
        if (mAlarmManagerWrapper == null) {
            mAlarmManagerWrapper = new TestAlarmManagerWrapper();
        }
        return mAlarmManagerWrapper;
    }

    @Override
    public UserEventLogger getUserEventLogger(Context unused) {
        if (mUserEventLogger == null) {
            mUserEventLogger = new com.android.wallpaper.testing.TestUserEventLogger();
        }
        return mUserEventLogger;
    }

    @Override
    public ExploreIntentChecker getExploreIntentChecker(Context unused) {
        if (mExploreIntentChecker == null) {
            mExploreIntentChecker = new TestExploreIntentChecker();
        }
        return mExploreIntentChecker;
    }

    @Override
    public SystemFeatureChecker getSystemFeatureChecker() {
        if (mSystemFeatureChecker == null) {
            mSystemFeatureChecker = new com.android.wallpaper.testing.TestSystemFeatureChecker();
        }
        return mSystemFeatureChecker;
    }

    @Override
    public FormFactorChecker getFormFactorChecker(Context unused) {
        if (mFormFactorChecker == null) {
            mFormFactorChecker = new TestFormFactorChecker();
        }
        return mFormFactorChecker;
    }

    @Override
    public WallpaperRotationRefresher getWallpaperRotationRefresher() {
        if (mWallpaperRotationRefresher == null) {
            mWallpaperRotationRefresher = (context, listener) -> {
                // Not implemented
                listener.onError();
            };
        }
        return mWallpaperRotationRefresher;
    }

    @Override
    public Fragment getPreviewFragment(Context context, WallpaperInfo wallpaperInfo, int mode,
            boolean viewAsHome, boolean testingModeEnabled) {
        return ImagePreviewFragment.newInstance(wallpaperInfo, mode, viewAsHome,
                testingModeEnabled);
    }

    @Override
    public PackageStatusNotifier getPackageStatusNotifier(Context context) {
        return null;
    }

    @Override
    public IndividualPickerFragment getIndividualPickerFragment(String collectionId) {
        return IndividualPickerFragment.newInstance(collectionId);
    }

    @Override
    public LiveWallpaperInfoFactory getLiveWallpaperInfoFactory(Context context) {
        return new DefaultLiveWallpaperInfoFactory();
    }

    @Override
    public DrawableLayerResolver getDrawableLayerResolver() {
        return null;
    }

    @Override
    public Intent getDeepLinkRedirectIntent(Context context, Uri uri) {
        return null;
    }

    @Override
    public String getDownloadableIntentAction() {
        return null;
    }

    @Override
    public PerformanceMonitor getPerformanceMonitor() {
        if (mPerformanceMonitor == null) {
            mPerformanceMonitor = new TestPerformanceMonitor();
        }
        return mPerformanceMonitor;
    }

    @Override
    public CustomizationSections getCustomizationSections() {
        return null;
    }
}
