/*
 * Copyright (C) 2016 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 android.service.notification;

import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * Represents an option to be shown to users for snoozing a notification until a given context
 * instead of for a fixed amount of time.
 * @hide
 */
@SystemApi
public final class SnoozeCriterion implements Parcelable {
    private final String mId;
    private final CharSequence mExplanation;
    private final CharSequence mConfirmation;

    public SnoozeCriterion(String id, CharSequence explanation, CharSequence confirmation) {
        mId = id;
        mExplanation = explanation;
        mConfirmation = confirmation;
    }

    protected SnoozeCriterion(Parcel in) {
        if (in.readByte() != 0) {
            mId = in.readString();
        } else {
            mId = null;
        }
        if (in.readByte() != 0) {
            mExplanation = in.readCharSequence();
        } else {
            mExplanation = null;
        }
        if (in.readByte() != 0) {
            mConfirmation = in.readCharSequence();
        } else {
            mConfirmation = null;
        }
    }

    /**
     * Returns the id of this criterion.
     */
    public String getId() {
        return mId;
    }

    /**
     * Returns the user visible explanation of how long a notification will be snoozed if
     * this criterion is chosen.
     */
    public CharSequence getExplanation() {
        return mExplanation;
    }

    /**
     * Returns the user visible confirmation message shown when this criterion is chosen.
     */
    public CharSequence getConfirmation() {
        return mConfirmation;
    }

    public static final @android.annotation.NonNull Creator<SnoozeCriterion> CREATOR = new Creator<SnoozeCriterion>() {
        @Override
        public SnoozeCriterion createFromParcel(Parcel in) {
            return new SnoozeCriterion(in);
        }

        @Override
        public SnoozeCriterion[] newArray(int size) {
            return new SnoozeCriterion[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        if (mId != null) {
            dest.writeByte((byte) 1);
            dest.writeString(mId);
        } else {
            dest.writeByte((byte) 0);
        }
        if (mExplanation != null) {
            dest.writeByte((byte) 1);
            dest.writeCharSequence(mExplanation);
        } else {
            dest.writeByte((byte) 0);
        }
        if (mConfirmation != null) {
            dest.writeByte((byte) 1);
            dest.writeCharSequence(mConfirmation);
        } else {
            dest.writeByte((byte) 0);
        }
    }

    @Override
    public boolean equals(@Nullable Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SnoozeCriterion that = (SnoozeCriterion) o;

        if (mId != null ? !mId.equals(that.mId) : that.mId != null) return false;
        if (mExplanation != null ? !mExplanation.equals(that.mExplanation)
                : that.mExplanation != null) {
            return false;
        }
        return mConfirmation != null ? mConfirmation.equals(that.mConfirmation)
                : that.mConfirmation == null;

    }

    @Override
    public int hashCode() {
        int result = mId != null ? mId.hashCode() : 0;
        result = 31 * result + (mExplanation != null ? mExplanation.hashCode() : 0);
        result = 31 * result + (mConfirmation != null ? mConfirmation.hashCode() : 0);
        return result;
    }
}
