// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.explore_sites;

import android.content.Context;

import org.chromium.base.ContextUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.background_task_scheduler.NativeBackgroundTask;
import org.chromium.chrome.browser.background_task_scheduler.NativeBackgroundTask.StartBeforeNativeResult;
import org.chromium.chrome.browser.offlinepages.DeviceConditions;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.components.background_task_scheduler.BackgroundTask.TaskFinishedCallback;
import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
import org.chromium.components.background_task_scheduler.TaskIds;
import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.components.background_task_scheduler.TaskParameters;
import org.chromium.net.ConnectionType;

import java.util.concurrent.TimeUnit;

/**
 * Schedules and executes background update of the Explore Sites catalog.
 *
 * The catalog is updated on a somewhat slow schedule, but this code checks for updates
 * approximately daily so that freshness is maintained.
 */
@JNINamespace("explore_sites")
public class ExploreSitesBackgroundTask extends NativeBackgroundTask {
    public static final int DEFAULT_DELAY_HOURS = 25;
    public static final int DEFAULT_FLEX_HOURS = 2;

    private TaskFinishedCallback mTaskFinishedCallback;
    private Profile mProfile;

    public ExploreSitesBackgroundTask() {}

    @VisibleForTesting
    protected Profile getProfile() {
        if (mProfile == null) mProfile = Profile.getLastUsedProfile();
        return mProfile;
    }

    @Override
    public @StartBeforeNativeResult int onStartTaskBeforeNativeLoaded(
            Context context, TaskParameters taskParameters, TaskFinishedCallback callback) {
        @ConnectionType
        int connectionType = DeviceConditions.getCurrentNetConnectionType(context);
        if (connectionType == ConnectionType.CONNECTION_NONE) {
            return StartBeforeNativeResult.RESCHEDULE;
        }
        return StartBeforeNativeResult.LOAD_NATIVE;
    }

    @Override
    protected void onStartTaskWithNative(
            Context context, TaskParameters taskParameters, TaskFinishedCallback callback) {
        assert taskParameters.getTaskId() == TaskIds.EXPLORE_SITES_REFRESH_JOB_ID;
        mTaskFinishedCallback = callback;
        ExploreSitesBridge.updateCatalogFromNetwork(
                getProfile(), (ignored) -> mTaskFinishedCallback.taskFinished(false));
    }

    @Override
    protected boolean onStopTaskBeforeNativeLoaded(Context context, TaskParameters taskParameters) {
        // Don't retry, this task is periodic anyways.
        return false;
    }

    @Override
    protected boolean onStopTaskWithNative(Context context, TaskParameters taskParameters) {
        // Don't retry, this task is periodic anyways.
        return false;
    }

    @Override
    public void reschedule(Context context) {
        schedule();
    }

    // Removes the task from the JobScheduler queue.  Should be called when the feature is disabled.
    public static void cancelTask() {
        BackgroundTaskSchedulerFactory.getScheduler().cancel(
                ContextUtils.getApplicationContext(), TaskIds.EXPLORE_SITES_REFRESH_JOB_ID);
    }

    // Begins the periodic update task.
    public static void schedule() {
        TaskInfo.Builder taskInfoBuilder =
                TaskInfo.createPeriodicTask(TaskIds.EXPLORE_SITES_REFRESH_JOB_ID,
                                ExploreSitesBackgroundTask.class,
                                TimeUnit.HOURS.toMillis(DEFAULT_DELAY_HOURS),
                                TimeUnit.HOURS.toMillis(DEFAULT_FLEX_HOURS))
                        .setRequiredNetworkType(TaskInfo.NETWORK_TYPE_ANY)
                        .setIsPersisted(true)
                        .setUpdateCurrent(true);
        BackgroundTaskSchedulerFactory.getScheduler().schedule(
                ContextUtils.getApplicationContext(), taskInfoBuilder.build());
    }
}
