package io.everitoken.sdk.java.dto;

import java.util.Objects;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;

import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.joda.time.DateTime;

import io.everitoken.sdk.java.Address;
import io.everitoken.sdk.java.Asset;
import io.everitoken.sdk.java.PublicKey;

public class FungibleDetailData implements Meta {
    private final PublicKey creator;
    private final Permission issue;
    private final Address address;
    private final JSONArray metas;
    private final String name;
    private final String symName;
    private final DateTime createdTime;
    private final Asset currentSupply;
    private final Asset totalSupply;
    private final String sym;
    private final Permission manage;

    public FungibleDetailData(PublicKey creator, Permission issue, Address address, JSONArray metas, String name,
            DateTime createdTime, Asset currentSupply, Asset totalSupply, String sym, Permission manage,
            String symName) {
        this.creator = creator;
        this.issue = issue;
        this.address = address;
        this.metas = metas;
        this.name = name;
        this.createdTime = createdTime;
        this.currentSupply = currentSupply;
        this.totalSupply = totalSupply;
        this.sym = sym;
        this.manage = manage;
        this.symName = symName;
    }

    @NotNull
    @Contract("_ -> new")
    public static FungibleDetailData ofRaw(JSONObject raw) {
        Objects.requireNonNull(raw);
        return new FungibleDetailData(PublicKey.of(raw.getString("creator")),
                Permission.ofRaw(raw.getJSONObject("issue")), Address.of(raw.getString("address")),
                raw.getJSONArray("metas"), raw.getString("name"), new DateTime(raw.getString("create_time")),
                Asset.parseFromRawBalance(raw.getString("current_supply")),
                Asset.parseFromRawBalance(raw.getString("total_supply")), raw.getString("sym"),
                Permission.ofRaw(raw.getJSONObject("manage")), raw.getString("sym_name"));
    }

    @JSONField(ordinal = 1)
    public String getCreator() {
        return creator.toString();
    }

    @JSONField(ordinal = 6)
    public Permission getIssue() {
        return issue;
    }

    @JSONField(ordinal = 3)
    public String getAddress() {
        return address.toString();
    }

    @JSONField(name = "sym_name", ordinal = 4)
    public String getSymName() {
        return symName;
    }

    @JSONField(name = "name", ordinal = 9)
    public String getName() {
        return name;
    }

    @JSONField(name = "create_time", ordinal = 5)
    public DateTime getCreatedTime() {
        return createdTime;
    }

    @JSONField(name = "current_supply", ordinal = 2)
    public String getCurrentSupply() {
        return currentSupply.toString();
    }

    @JSONField(name = "total_supply", ordinal = 7)
    public String getTotalSupply() {
        return totalSupply.toString();
    }

    @JSONField(ordinal = 8)
    public String getSym() {
        return sym;
    }

    @JSONField(ordinal = 11)
    public Permission getManage() {
        return manage;
    }

    @Override
    public JSONArray getMetas() {
        return metas;
    }
}