/*
 * 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.wifi;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.net.KeepalivePacketData;
import android.net.LinkProperties;
import android.net.NetworkAgent;
import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
import android.net.NetworkProvider;
import android.net.Uri;
import android.os.Looper;

import java.time.Duration;

/** Created to facilitate mocking during unit testing. */
public class WifiNetworkAgent extends NetworkAgent {

    private static final String TAG = "WifiNetworkAgent";

    public interface Callback {
        void onNetworkUnwanted();
        void onValidationStatus(int status, @Nullable Uri redirectUri);
        void onSaveAcceptUnvalidated(boolean accept);
        void onStartSocketKeepalive(int slot, @NonNull Duration interval,
                @NonNull KeepalivePacketData packet);
        void onStopSocketKeepalive(int slot);
        void onAddKeepalivePacketFilter(int slot, @NonNull KeepalivePacketData packet);
        void onRemoveKeepalivePacketFilter(int slot);
        void onSignalStrengthThresholdsUpdated(@NonNull int[] thresholds);
        void onAutomaticReconnectDisabled();
    }

    private final Callback mCallback;

    /** Cache the latest NetworkCapabilities update */
    @NonNull private NetworkCapabilities mCurrentNetworkCapabilities;

    /**
     * Create a new network agent.
     *
     * @param context  a {@link Context} to get system services from.
     * @param looper   the {@link Looper} on which to invoke the callbacks.
     * @param nc       the initial {@link NetworkCapabilities} of this network. Update with
     *                 sendNetworkCapabilities.
     * @param lp       the initial {@link LinkProperties} of this network. Update with
     *                 sendLinkProperties.
     * @param score    the initial score of this network. Update with sendNetworkScore.
     * @param config   an immutable {@link NetworkAgentConfig} for this agent.
     * @param provider the {@link NetworkProvider} managing this agent.
     * @param wifiNetworkAgentCallback implementation
     */
    public WifiNetworkAgent(
            @NonNull Context context,
            @NonNull Looper looper,
            @NonNull NetworkCapabilities nc,
            @NonNull LinkProperties lp,
            @NonNull NetworkAgentConfig config,
            @Nullable NetworkProvider provider,
            @NonNull Callback wifiNetworkAgentCallback) {
        super(context, looper, TAG, nc, lp, ConnectedScore.WIFI_INITIAL_SCORE, config, provider);
        mCurrentNetworkCapabilities = nc;
        mCallback = wifiNetworkAgentCallback;
        register();
    }

    @Override
    public void onNetworkUnwanted() {
        mCallback.onNetworkUnwanted();
    }

    @Override
    public void onValidationStatus(int status, @Nullable Uri redirectUri) {
        mCallback.onValidationStatus(status, redirectUri);
    }

    @Override
    public void onSaveAcceptUnvalidated(boolean accept) {
        mCallback.onSaveAcceptUnvalidated(accept);
    }

    @Override
    public void onStartSocketKeepalive(int slot, @NonNull Duration interval,
            @NonNull KeepalivePacketData packet) {
        mCallback.onStartSocketKeepalive(slot, interval, packet);
    }

    @Override
    public void onStopSocketKeepalive(int slot) {
        mCallback.onStopSocketKeepalive(slot);
    }

    @Override
    public void onAddKeepalivePacketFilter(int slot, @NonNull KeepalivePacketData packet) {
        mCallback.onAddKeepalivePacketFilter(slot, packet);
    }

    @Override
    public void onRemoveKeepalivePacketFilter(int slot) {
        mCallback.onRemoveKeepalivePacketFilter(slot);
    }

    @Override
    public void onSignalStrengthThresholdsUpdated(@NonNull int[] thresholds) {
        mCallback.onSignalStrengthThresholdsUpdated(thresholds);
    }

    @Override
    public void onAutomaticReconnectDisabled() {
        mCallback.onAutomaticReconnectDisabled();
    }

    @NonNull
    public Callback getCallback() {
        return mCallback;
    }

    /** sendNetworkCapabilities is final in NetworkAgent, so can't override that method directly */
    public void sendNetworkCapabilitiesAndCache(@NonNull NetworkCapabilities nc) {
        mCurrentNetworkCapabilities = nc;
        super.sendNetworkCapabilities(nc);
    }

    @NonNull
    public NetworkCapabilities getCurrentNetworkCapabilities() {
        return mCurrentNetworkCapabilities;
    }
}
