/*
 * Copyright (C) 2023 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.settings.connecteddevice.audiosharing;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.bluetooth.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.utils.ThreadUtils;

public abstract class AudioSharingBasePreferenceController extends BasePreferenceController
        implements DefaultLifecycleObserver {
    private static final String TAG = "AudioSharingBasePreferenceController";

    private final BluetoothAdapter mBluetoothAdapter;
    @Nullable private final LocalBluetoothManager mBtManager;
    @Nullable private final LocalBluetoothProfileManager mProfileManager;
    @Nullable protected final LocalBluetoothLeBroadcast mBroadcast;
    @Nullable protected Preference mPreference;

    public AudioSharingBasePreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mBtManager = Utils.getLocalBtManager(context);
        mProfileManager = mBtManager == null ? null : mBtManager.getProfileManager();
        mBroadcast = mProfileManager == null ? null : mProfileManager.getLeAudioBroadcastProfile();
    }

    @Override
    public int getAvailabilityStatus() {
        return AudioSharingUtils.isFeatureEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = screen.findPreference(getPreferenceKey());
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        updateVisibility();
    }

    /** Update the visibility of the preference. */
    protected void updateVisibility() {
        if (mPreference == null) {
            Log.d(TAG, "Skip updateVisibility, null preference");
            return;
        }
        var unused =
                ThreadUtils.postOnBackgroundThread(
                        () -> {
                            if (!isAvailable()) {
                                Log.w(TAG, "Skip updateVisibility, unavailable preference");
                                AudioSharingUtils.postOnMainThread(
                                        mContext,
                                        () -> { // Check nullability to pass NullAway check
                                            if (mPreference != null) {
                                                mPreference.setVisible(false);
                                            }
                                        });
                                return;
                            }
                            boolean isBtOn = isBluetoothStateOn();
                            boolean isProfileReady =
                                    AudioSharingUtils.isAudioSharingProfileReady(mProfileManager);
                            boolean isBroadcasting = isBroadcasting();
                            boolean isVisible = isBtOn && isProfileReady && isBroadcasting;
                            Log.d(
                                    TAG,
                                    "updateVisibility, isBtOn = "
                                            + isBtOn
                                            + ", isProfileReady = "
                                            + isProfileReady
                                            + ", isBroadcasting = "
                                            + isBroadcasting);
                            AudioSharingUtils.postOnMainThread(
                                    mContext,
                                    () -> { // Check nullability to pass NullAway check
                                        if (mPreference != null) {
                                            mPreference.setVisible(isVisible);
                                        }
                                    });
                        });
    }

    /**
     * Triggered when {@link AudioSharingDashboardFragment} receive onAudioSharingProfilesConnected
     * callbacks.
     */
    protected void onAudioSharingProfilesConnected() {}

    protected boolean isBroadcasting() {
        return mBroadcast != null && mBroadcast.isEnabled(null);
    }

    protected boolean isBluetoothStateOn() {
        return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled();
    }
}
