/*
 * Copyright (C) 2021 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.server.job;

import android.annotation.TargetApi;
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;

import java.util.ArrayList;

@TargetApi(24)
public class MockBiasJobService extends JobService {
    private static final String TAG = "MockBiasJobService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG, "Created test service.");
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.i(TAG, "Test job executing: " + params.getJobId());
        TestEnvironment.getTestEnvironment().mExecutedEvents.add(
                new TestEnvironment.Event(TestEnvironment.EVENT_START_JOB, params.getJobId()));
        return true;  // Job not finished
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.i(TAG, "Test job stop executing: " + params.getJobId());
        int reason = params.getStopReason();
        int event = TestEnvironment.EVENT_STOP_JOB;
        Log.d(TAG, "stop reason: " + String.valueOf(reason));
        if (reason == JobParameters.STOP_REASON_PREEMPT) {
            event = TestEnvironment.EVENT_PREEMPT_JOB;
            Log.d(TAG, "preempted " + String.valueOf(params.getJobId()));
        }
        TestEnvironment.getTestEnvironment().mExecutedEvents
                .add(new TestEnvironment.Event(event, params.getJobId()));
        return false;  // Do not reschedule
    }

    public static class TestEnvironment {

        public static final int EVENT_START_JOB = 0;
        public static final int EVENT_PREEMPT_JOB = 1;
        public static final int EVENT_STOP_JOB = 2;

        private static TestEnvironment sTestEnvironment;

        private final ArrayList<Event> mExecutedEvents = new ArrayList<>();

        public static TestEnvironment getTestEnvironment() {
            if (sTestEnvironment == null) {
                sTestEnvironment = new TestEnvironment();
            }
            return sTestEnvironment;
        }

        public static class Event {
            public int event;
            public int jobId;

            public Event() {
            }

            public Event(int event, int jobId) {
                this.event = event;
                this.jobId = jobId;
            }

            @Override
            public boolean equals(Object other) {
                if (other instanceof Event) {
                    Event otherEvent = (Event) other;
                    return otherEvent.event == event && otherEvent.jobId == jobId;
                }
                return false;
            }
        }

        public void setUp() {
            mExecutedEvents.clear();
        }

        public ArrayList<Event> getExecutedEvents() {
            return mExecutedEvents;
        }
    }
}
