package io.kubernetes.client.custom;

import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Objects;

import org.apache.commons.lang3.ObjectUtils;

@JsonAdapter(Quantity.QuantityAdapter.class)
public class Quantity {

    private final BigDecimal number;
    private Format format;

    public enum Format {
        DECIMAL_EXPONENT(10), DECIMAL_SI(10), BINARY_SI(2);

        private int base;

        Format(final int base) {
            this.base = base;
        }

        public int getBase() {
            return base;
        }
    }

    public Quantity(final BigDecimal number, final Format format) {
        this.number = number;
        this.format = format;
    }

    public Quantity(final String value) {
        this.number = fromString(value).number;
        this.format = fromString(value).format;
    }

    public BigDecimal getNumber() {
        return number;
    }

    public Format getFormat() {
        return format;
    }

    public static Quantity fromString(final String value) {
        return new QuantityFormatter().parse(value);
    }

    public String toSuffixedString() {
        return new QuantityFormatter().format(this);
    }

    @Override
    public String toString() {
        return "Quantity{" +
                "number=" + number +
                ", format=" + format +
                '}';
    }

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

        Quantity otherQuantity = (Quantity) o;

        return ObjectUtils.compare(this.number, otherQuantity.number) == 0 &&
        		Objects.equals(this.format, otherQuantity.format);
    }

    public class QuantityAdapter extends TypeAdapter<Quantity> {
        @Override
        public void write(JsonWriter jsonWriter, Quantity quantity) throws IOException {
            jsonWriter.value(quantity.toSuffixedString());
        }

        @Override
        public Quantity read(JsonReader jsonReader) throws IOException {
            return Quantity.fromString(jsonReader.nextString());
        }
    }
}
