/*
 * Copyright (C) 2018 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.car.storagemonitoring;

import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.JsonWriter;
import java.io.IOException;
import java.util.Objects;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Information about how many bytes were written to a filesystem during its lifetime.
 *
 * @hide
 */
@SystemApi
public final class LifetimeWriteInfo implements Parcelable {
    public static final Creator<IoStats> CREATOR = new Creator<IoStats>() {
        @Override
        public IoStats createFromParcel(Parcel in) {
            return new IoStats(in);
        }

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

    public final String partition;
    public final String fstype;
    public final long writtenBytes;

    public LifetimeWriteInfo(String partition, String fstype, long writtenBytes) {
        this.partition = Objects.requireNonNull(partition);
        this.fstype = Objects.requireNonNull(fstype);
        if (writtenBytes < 0) {
            throw new IllegalArgumentException("writtenBytes must be non-negative");
        }
        this.writtenBytes = writtenBytes;
    }

    public LifetimeWriteInfo(Parcel in) {
        this.partition = in.readString();
        this.fstype = in.readString();
        this.writtenBytes = in.readLong();
    }

    public LifetimeWriteInfo(JSONObject in) throws JSONException {
        partition = in.getString("partition");
        fstype = in.getString("fstype");
        writtenBytes = in.getLong("writtenBytes");
    }


    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(partition);
        dest.writeString(fstype);
        dest.writeLong(writtenBytes);
    }

    public void writeToJson(JsonWriter jsonWriter) throws IOException {
        jsonWriter.beginObject();
        jsonWriter.name("partition").value(partition);
        jsonWriter.name("fstype").value(fstype);
        jsonWriter.name("writtenBytes").value(writtenBytes);
        jsonWriter.endObject();
    }


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

    @Override
    public boolean equals(Object other) {
        if (other instanceof LifetimeWriteInfo) {
            LifetimeWriteInfo lifetime = (LifetimeWriteInfo)other;
            return partition.equals(lifetime.partition) &&
                    fstype.equals(lifetime.fstype) &&
                    writtenBytes == lifetime.writtenBytes;
        }

        return false;
    }

    @Override
    public String toString() {
        return String.format("for partition %s of type %s, %d bytes were written",
                partition, fstype, writtenBytes);
    }
}
