/*
 * Copyright 2020 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 androidx.wear.watchface.client

import android.app.NotificationManager
import androidx.annotation.IntDef

/**
 * The InterruptionFilter.
 * @hide
 */
@IntDef(
    value = [
        NotificationManager.INTERRUPTION_FILTER_ALARMS,
        NotificationManager.INTERRUPTION_FILTER_ALL,
        NotificationManager.INTERRUPTION_FILTER_NONE,
        NotificationManager.INTERRUPTION_FILTER_PRIORITY,
        NotificationManager.INTERRUPTION_FILTER_UNKNOWN
    ]
)
public annotation class InterruptionFilter

/**
 * Describes the system state of the watch face ui.
 *
 * @param inAmbientMode Whether the device is is ambient mode or not.
 * @param interruptionFilter The interruption filter defines which notifications are allowed to
 * interrupt the user. For watch faces this value is one of:
 * [NotificationManager.INTERRUPTION_FILTER_ALARMS],
 * [NotificationManager.INTERRUPTION_FILTER_ALL],
 * [NotificationManager.INTERRUPTION_FILTER_NONE],
 * [NotificationManager.INTERRUPTION_FILTER_PRIORITY],
 * [NotificationManager.INTERRUPTION_FILTER_UNKNOWN]. @see [NotificationManager] for more details.
 */
public class WatchUiState(
    @get:JvmName("inAmbientMode")
    public val inAmbientMode: Boolean,

    @InterruptionFilter
    public val interruptionFilter: Int
) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as WatchUiState

        if (inAmbientMode != other.inAmbientMode) return false
        if (interruptionFilter != other.interruptionFilter) return false

        return true
    }

    override fun hashCode(): Int {
        var result = inAmbientMode.hashCode()
        result = 31 * result + interruptionFilter
        return result
    }

    override fun toString(): String {
        return "WatchUiState(inAmbientMode=$inAmbientMode, interruptionFilter=$interruptionFilter)"
    }
}