package net.nitroshare.android.transfer;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Status information about a transfer
 */
public class TransferStatus implements Parcelable {

    /**
     * Direction of transfer relative to the current device
     */
    public enum Direction {
        Receive,
        Send,
    }

    /**
     * State of the transfer
     */
    public enum State {
        Connecting,
        Transferring,
        Failed,
        Succeeded,
    }

    private int mId;
    private Direction mDirection;
    private String mRemoteDeviceName;
    private State mState;
    private int mProgress;
    private long mBytesTransferred = 0;
    private long mBytesTotal = 0;
    private String mError;

    /**
     * Initialize transfer status from a transfer
     */
    TransferStatus(String deviceName, Direction direction, State state) {
        mDirection = direction;
        mRemoteDeviceName = deviceName;
        mState = state;
    }

    /**
     * Initialize transfer status from another instance
     */
    TransferStatus(TransferStatus status) {
        this.mId = status.mId;
        this.mDirection = status.mDirection;
        this.mRemoteDeviceName = status.mRemoteDeviceName;
        this.mState = status.mState;
        this.mProgress = status.mProgress;
        this.mBytesTransferred = status.mBytesTransferred;
        this.mBytesTotal = status.mBytesTotal;
        this.mError = status.mError;
    }

    /**
     * Initialize transfer status from a parcel
     */
    private TransferStatus(Parcel in) {
        this.mId = in.readInt();
        this.mDirection = Direction.valueOf(in.readString());
        this.mRemoteDeviceName = in.readString();
        this.mState = State.valueOf(in.readString());
        this.mProgress = in.readInt();
        this.mBytesTransferred = in.readLong();
        this.mBytesTotal = in.readLong();
        this.mError = in.readString();
    }

    public static final Creator<TransferStatus> CREATOR = new Creator<TransferStatus>() {
        @Override
        public TransferStatus createFromParcel(Parcel in) {
            return new TransferStatus(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mId);
        out.writeString(mDirection.name());
        out.writeString(mRemoteDeviceName);
        out.writeString(mState.name());
        out.writeInt(mProgress);
        out.writeLong(mBytesTransferred);
        out.writeLong(mBytesTotal);
        out.writeString(mError);
    }

    public int getId() {
        return mId;
    }

    public void setId(int id) {
        mId = id;
    }

    public Direction getDirection() {
        return mDirection;
    }

    public void setDirection(Direction direction) {
        mDirection = direction;
    }

    public String getRemoteDeviceName() {
        return mRemoteDeviceName;
    }

    public void setRemoteDeviceName(String remoteDeviceName) {
        mRemoteDeviceName = remoteDeviceName;
    }

    public State getState() {
        return mState;
    }

    public void setState(State state) {
        mState = state;
    }

    public int getProgress() {
        return mProgress;
    }

    public void setProgress(int progress) {
        mProgress = progress;
    }

    public long getBytesTransferred() {
        return mBytesTransferred;
    }

    public void setBytesTransferred(long bytesTransferred) {
        mBytesTransferred = bytesTransferred;
    }

    public long getBytesTotal() {
        return mBytesTotal;
    }

    public void setBytesTotal(long bytesTotal) {
        mBytesTotal = bytesTotal;
    }

    public String getError() {
        return mError;
    }

    public void setError(String error) {
        mError = error;
    }

    public boolean isFinished() {
        return mState == State.Succeeded || mState == State.Failed;
    }
}