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

import android.content.ComponentName;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * This class represents the unique id of a printer.
 */
public final class PrinterId implements Parcelable {

    private final ComponentName mServiceComponentName;

    private final String mLocalId;

    /**
     * Creates a new instance.
     *
     * @param serviceComponentName The managing print service.
     * @param localId The unique id within the managing service.
     *
     * @hide
     */
    public PrinterId(ComponentName serviceComponentName, String localId) {
        mServiceComponentName = serviceComponentName;
        mLocalId = localId;
    }

    private PrinterId(Parcel parcel) {
        mServiceComponentName = parcel.readParcelable(null);
        mLocalId = parcel.readString();
    }

    /**
     * The id of the print service this printer is managed by.
     *
     * @return The print service component name.
     *
     * @hide
     */
    public ComponentName getService() {
        return mServiceComponentName;
    }

    /**
     * Gets the local id of this printer in the context
     * of the print service that manages it.
     *
     * @return The local id.
     */
    public String getLocalId() {
        return mLocalId;
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeParcelable(mServiceComponentName, flags);
        parcel.writeString(mLocalId);
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) {
            return true;
        }
        if (object == null) {
            return false;
        }
        if (getClass() != object.getClass()) {
            return false;
        }
        PrinterId other = (PrinterId) object;
        if (mServiceComponentName == null) {
            if (other.mServiceComponentName != null) {
                return false;
            }
        } else if (!mServiceComponentName.equals(other.mServiceComponentName)) {
            return false;
        }
        if (mLocalId != other.mLocalId) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int hashCode = 1;
        hashCode = prime * hashCode + ((mServiceComponentName != null)
                ? mServiceComponentName.hashCode() : 1);
        hashCode = prime * hashCode + mLocalId.hashCode();
        return hashCode;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("PrinterId{");
        builder.append(mServiceComponentName.flattenToString());
        builder.append(":");
        builder.append(mLocalId);
        builder.append('}');
        return builder.toString();
    }

    /**
     * @hide
     */
    public String flattenToString() {
        return mServiceComponentName.flattenToString() + ":" + mLocalId;
    }

    /**
     * @hide
     */
    public static PrinterId unflattenFromString(String string) {
        String[] split = string.split(":");
        if (split.length != 2) {
            throw new IllegalArgumentException("Not well-formed printer id:" + string);
        }
        ComponentName component = ComponentName.unflattenFromString(split[0]);
        String localId = String.valueOf(split[1]);
        return new PrinterId(component, localId);
    }

    public static final Parcelable.Creator<PrinterId> CREATOR =
            new Creator<PrinterId>() {
        @Override
        public PrinterId createFromParcel(Parcel parcel) {
            return new PrinterId(parcel);
        }

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