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

import android.companion.virtual.VirtualDevice;
import android.companion.virtual.VirtualDeviceManager;
import android.content.Context;
import android.graphics.drawable.Icon;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.widget.LayoutPreference;

import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/** This class adds a header for a virtual device with a heading and icon. */
public class VirtualDeviceDetailsHeaderController extends BasePreferenceController implements
        LifecycleObserver, VirtualDeviceManager.VirtualDeviceListener {

    private static final String KEY_VIRTUAL_DEVICE_DETAILS_HEADER = "virtual_device_details_header";

    @Nullable
    private final VirtualDeviceManager mVirtualDeviceManager;
    @Nullable
    private VirtualDeviceWrapper mDevice;
    @Nullable
    private TextView mSummaryView;

    private final Executor mExecutor = Executors.newSingleThreadExecutor();

    public VirtualDeviceDetailsHeaderController(@NonNull Context context) {
        super(context, KEY_VIRTUAL_DEVICE_DETAILS_HEADER);
        mVirtualDeviceManager =
                Objects.requireNonNull(context.getSystemService(VirtualDeviceManager.class));
    }

    /** One-time initialization when the controller is first created. */
    void init(@NonNull VirtualDeviceWrapper device) {
        mDevice = device;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart() {
        if (mVirtualDeviceManager != null) {
            mVirtualDeviceManager.registerVirtualDeviceListener(mExecutor, this);
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop() {
        if (mVirtualDeviceManager != null) {
            mVirtualDeviceManager.unregisterVirtualDeviceListener(this);
        }
    }

    @Override
    public void onVirtualDeviceCreated(int deviceId) {
        VirtualDevice device =
                Objects.requireNonNull(mVirtualDeviceManager).getVirtualDevice(deviceId);
        if (mDevice != null && device != null
                && mDevice.getPersistentDeviceId().equals(device.getPersistentDeviceId())) {
            mDevice.setDeviceId(deviceId);
            mContext.getMainExecutor().execute(this::updateSummary);
        }
    }

    @Override
    public void onVirtualDeviceClosed(int deviceId) {
        if (mDevice != null && deviceId == mDevice.getDeviceId()) {
            mDevice.setDeviceId(Context.DEVICE_ID_INVALID);
            mContext.getMainExecutor().execute(this::updateSummary);
        }
    }

    @Override
    public void displayPreference(@NonNull PreferenceScreen screen) {
        super.displayPreference(screen);
        LayoutPreference headerPreference = screen.findPreference(getPreferenceKey());
        View view = headerPreference.findViewById(R.id.entity_header);
        TextView titleView = view.findViewById(R.id.entity_header_title);
        ImageView iconView = headerPreference.findViewById(R.id.entity_header_icon);
        mSummaryView = view.findViewById(R.id.entity_header_summary);
        updateSummary();
        if (mDevice != null) {
            titleView.setText(mDevice.getDeviceName(mContext));
            Icon deviceIcon = android.companion.Flags.associationDeviceIcon()
                    ? mDevice.getAssociationInfo().getDeviceIcon() : null;
            if (deviceIcon == null) {
                iconView.setImageResource(R.drawable.ic_devices_other);
            } else {
                iconView.setImageIcon(deviceIcon);
            }
        }
    }

    private void updateSummary() {
        if (mSummaryView != null && mDevice != null) {
            mSummaryView.setText(mDevice.getDeviceId() != Context.DEVICE_ID_INVALID
                    ? R.string.virtual_device_connected : R.string.virtual_device_disconnected);
        }
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }
}
