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

import android.content.Context;

import com.android.wallpaper.compat.WallpaperManagerCompat;
import com.android.wallpaper.network.Requester;
import com.android.wallpaper.network.WallpaperRequester;
import com.android.wallpaper.picker.individual.IndividualPickerFragment;

/**
 * Base implementation of Injector.
 */
public abstract class BaseWallpaperInjector implements Injector {
    private BitmapCropper mBitmapCropper;
    private PartnerProvider mPartnerProvider;
    private WallpaperPersister mWallpaperPersister;
    private WallpaperPreferences mPrefs;
    private WallpaperRefresher mWallpaperRefresher;
    private Requester mRequester;
    private WallpaperManagerCompat mWallpaperManagerCompat;
    private CurrentWallpaperInfoFactory mCurrentWallpaperFactory;
    private NetworkStatusNotifier mNetworkStatusNotifier;
    private AlarmManagerWrapper mAlarmManagerWrapper;
    private ExploreIntentChecker mExploreIntentChecker;
    private SystemFeatureChecker mSystemFeatureChecker;
    private FormFactorChecker mFormFactorChecker;
    private PackageStatusNotifier mPackageStatusNotifier;
    private LiveWallpaperInfoFactory mLiveWallpaperInfoFactory;
    private DrawableLayerResolver mDrawableLayerResolver;

    @Override
    public synchronized BitmapCropper getBitmapCropper() {
        if (mBitmapCropper == null) {
            mBitmapCropper = new DefaultBitmapCropper();
        }
        return mBitmapCropper;
    }

    @Override
    public synchronized PartnerProvider getPartnerProvider(Context context) {
        if (mPartnerProvider == null) {
            mPartnerProvider = new DefaultPartnerProvider(context.getApplicationContext());
        }
        return mPartnerProvider;
    }

    @Override
    public synchronized WallpaperPreferences getPreferences(Context context) {
        if (mPrefs == null) {
            mPrefs = new DefaultWallpaperPreferences(context.getApplicationContext());
        }
        return mPrefs;
    }

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

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

    @Override
    public synchronized Requester getRequester(Context context) {
        if (mRequester == null) {
            mRequester = new WallpaperRequester(context.getApplicationContext());
        }
        return mRequester;
    }

    @Override
    public synchronized WallpaperManagerCompat getWallpaperManagerCompat(Context context) {
        if (mWallpaperManagerCompat == null) {
            mWallpaperManagerCompat = WallpaperManagerCompat.getInstance(context);
        }
        return mWallpaperManagerCompat;
    }

    @Override
    public synchronized CurrentWallpaperInfoFactory getCurrentWallpaperFactory(Context context) {
        if (mCurrentWallpaperFactory == null) {
            mCurrentWallpaperFactory =
                    new DefaultCurrentWallpaperInfoFactory(context.getApplicationContext());
        }
        return mCurrentWallpaperFactory;
    }

    @Override
    public synchronized NetworkStatusNotifier getNetworkStatusNotifier(Context context) {
        if (mNetworkStatusNotifier == null) {
            mNetworkStatusNotifier = new DefaultNetworkStatusNotifier(context.getApplicationContext());
        }
        return mNetworkStatusNotifier;
    }

    @Override
    public synchronized PackageStatusNotifier getPackageStatusNotifier(Context context) {
        if (mPackageStatusNotifier == null) {
            mPackageStatusNotifier = new DefaultPackageStatusNotifier(
                    context.getApplicationContext());
        }
        return mPackageStatusNotifier;
    }

    @Override
    public synchronized AlarmManagerWrapper getAlarmManagerWrapper(Context context) {
        if (mAlarmManagerWrapper == null) {
            mAlarmManagerWrapper = new DefaultAlarmManagerWrapper(context.getApplicationContext());
        }
        return mAlarmManagerWrapper;
    }

    @Override
    public synchronized ExploreIntentChecker getExploreIntentChecker(Context context) {
        if (mExploreIntentChecker == null) {
            mExploreIntentChecker = new DefaultExploreIntentChecker(context.getApplicationContext());
        }
        return mExploreIntentChecker;
    }

    @Override
    public synchronized SystemFeatureChecker getSystemFeatureChecker() {
        if (mSystemFeatureChecker == null) {
            mSystemFeatureChecker = new DefaultSystemFeatureChecker();
        }
        return mSystemFeatureChecker;
    }

    @Override
    public synchronized FormFactorChecker getFormFactorChecker(Context context) {
        if (mFormFactorChecker == null) {
            mFormFactorChecker = new DefaultFormFactorChecker(context.getApplicationContext());
        }
        return mFormFactorChecker;
    }

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

    @Override
    public LiveWallpaperInfoFactory getLiveWallpaperInfoFactory(Context context) {
        if (mLiveWallpaperInfoFactory == null) {
            mLiveWallpaperInfoFactory = new DefaultLiveWallpaperInfoFactory();
        }
        return mLiveWallpaperInfoFactory;
    }

    @Override
    public DrawableLayerResolver getDrawableLayerResolver() {
        if (mDrawableLayerResolver == null) {
            mDrawableLayerResolver = new DefaultDrawableLayerResolver();
        }
        return mDrawableLayerResolver;
    }
}
