/*
 * Copyright 2021 HIMSA II K/S - www.himsa.com.
 * Represented by EHIMA - www.ehima.com
 *
 * 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 android.bluetooth;

import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

/**
 * Represents the Hearing Access Profile preset.
 *
 * @hide
 */
@SystemApi
public final class BluetoothHapPresetInfo implements Parcelable {
    private int mPresetIndex;
    private String mPresetName = "";
    private boolean mIsWritable;
    private boolean mIsAvailable;

    /**
     * HapPresetInfo constructor
     *
     * @param presetIndex Preset index
     * @param presetName Preset Name
     * @param isWritable Is writable flag
     * @param isAvailable Is available flag
     */
    /*package*/ BluetoothHapPresetInfo(
            int presetIndex, @NonNull String presetName, boolean isWritable, boolean isAvailable) {
        this.mPresetIndex = presetIndex;
        this.mPresetName = presetName;
        this.mIsWritable = isWritable;
        this.mIsAvailable = isAvailable;
    }

    /**
     * HapPresetInfo constructor
     *
     * @param in HapPresetInfo parcel
     */
    private BluetoothHapPresetInfo(@NonNull Parcel in) {
        mPresetIndex = in.readInt();
        mPresetName = in.readString();
        mIsWritable = in.readBoolean();
        mIsAvailable = in.readBoolean();
    }

    /**
     * HapPresetInfo preset index
     *
     * @return Preset index
     */
    public int getIndex() {
        return mPresetIndex;
    }

    /**
     * HapPresetInfo preset name
     *
     * @return Preset name
     */
    public @NonNull String getName() {
        return mPresetName;
    }

    /**
     * HapPresetInfo preset writability
     *
     * @return If preset is writable
     */
    public boolean isWritable() {
        return mIsWritable;
    }

    /**
     * HapPresetInfo availability
     *
     * @return If preset is available
     */
    public boolean isAvailable() {
        return mIsAvailable;
    }

    /** HapPresetInfo array creator */
    public static final @NonNull Creator<BluetoothHapPresetInfo> CREATOR =
            new Creator<BluetoothHapPresetInfo>() {
                public BluetoothHapPresetInfo createFromParcel(@NonNull Parcel in) {
                    return new BluetoothHapPresetInfo(in);
                }

                public BluetoothHapPresetInfo[] newArray(int size) {
                    return new BluetoothHapPresetInfo[size];
                }
            };

    /** @hide */
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mPresetIndex);
        dest.writeString(mPresetName);
        dest.writeBoolean(mIsWritable);
        dest.writeBoolean(mIsAvailable);
    }

    /**
     * Builder for {@link BluetoothHapPresetInfo}.
     *
     * <p>By default, the preset index will be set to {@link
     * BluetoothHapClient#PRESET_INDEX_UNAVAILABLE}, the name to an empty string, writability and
     * availability both to false.
     *
     * @hide
     */
    public static final class Builder {
        private int mPresetIndex = BluetoothHapClient.PRESET_INDEX_UNAVAILABLE;
        private String mPresetName = "";
        private boolean mIsWritable = false;
        private boolean mIsAvailable = false;

        /**
         * Creates a new builder.
         *
         * @param index The preset index for HAP preset info
         * @param name The preset name for HAP preset info
         */
        public Builder(int index, @NonNull String name) {
            if (TextUtils.isEmpty(name)) {
                throw new IllegalArgumentException(
                        "The size of the preset name for HAP shall be at"
                                + " least one character long.");
            }
            if (index < 0) {
                throw new IllegalArgumentException(
                        "Preset index for HAP shall be a non-negative value.");
            }

            mPresetIndex = index;
            mPresetName = name;
        }

        /**
         * Set preset writability for HAP preset info.
         *
         * @param isWritable whether preset is writable
         * @return the same Builder instance
         */
        public @NonNull Builder setWritable(boolean isWritable) {
            mIsWritable = isWritable;
            return this;
        }

        /**
         * Set preset availability for HAP preset info.
         *
         * @param isAvailable whether preset is currently available to select
         * @return the same Builder instance
         */
        public @NonNull Builder setAvailable(boolean isAvailable) {
            mIsAvailable = isAvailable;
            return this;
        }

        /**
         * Build {@link BluetoothHapPresetInfo}.
         *
         * @return new BluetoothHapPresetInfo built
         */
        public @NonNull BluetoothHapPresetInfo build() {
            return new BluetoothHapPresetInfo(mPresetIndex, mPresetName, mIsWritable, mIsAvailable);
        }
    }
}
