/*
 * 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.systemui.notetask

import android.app.role.RoleManager
import android.app.role.RoleManager.ROLE_NOTES
import android.content.Context
import android.content.pm.PackageManager
import android.content.pm.ShortcutInfo
import android.graphics.drawable.Icon
import android.os.PersistableBundle
import android.os.UserHandle
import com.android.systemui.R
import com.android.systemui.notetask.shortcut.LaunchNoteTaskActivity

/** Extension functions for [RoleManager] used **internally** by note task. */
@InternalNoteTaskApi
internal object NoteTaskRoleManagerExt {

    /**
     * Gets package name of the default (first) app holding the [role]. If none, returns either an
     * empty string or null.
     */
    fun RoleManager.getDefaultRoleHolderAsUser(role: String, user: UserHandle): String? =
        getRoleHoldersAsUser(role, user).firstOrNull()

    /** Creates a [ShortcutInfo] for [ROLE_NOTES]. */
    fun RoleManager.createNoteShortcutInfoAsUser(
        context: Context,
        user: UserHandle,
    ): ShortcutInfo {
        val packageName = getDefaultRoleHolderAsUser(ROLE_NOTES, user)

        val extras = PersistableBundle()
        if (packageName != null) {
            // Set custom app badge using the icon from ROLES_NOTES default app.
            extras.putString(NoteTaskController.EXTRA_SHORTCUT_BADGE_OVERRIDE_PACKAGE, packageName)
        }

        val shortLabel = context.getString(R.string.note_task_button_label)

        val applicationLabel = context.packageManager.getApplicationLabel(packageName)
        val longLabel =
            if (applicationLabel == null) {
                shortLabel
            } else {
                context.getString(
                    R.string.note_task_shortcut_long_label,
                    applicationLabel,
                )
            }

        val icon = Icon.createWithResource(context, R.drawable.ic_note_task_shortcut_widget)

        return ShortcutInfo.Builder(context, NoteTaskController.SHORTCUT_ID)
            .setIntent(LaunchNoteTaskActivity.createIntent(context))
            .setActivity(LaunchNoteTaskActivity.createComponent(context))
            .setShortLabel(shortLabel)
            .setLongLabel(longLabel)
            .setLongLived(true)
            .setIcon(icon)
            .setExtras(extras)
            .build()
    }

    private fun PackageManager.getApplicationLabel(packageName: String?): String? {
        if (packageName == null) {
            return null
        }

        return runCatching { getApplicationInfo(packageName, /* flags= */ 0)!! }
            .getOrNull()
            ?.let { info -> getApplicationLabel(info).toString() }
    }
}