package io.everitoken.sdk.java.dto;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

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

import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;

import io.everitoken.sdk.java.Signature;

public class TransactionDetail {
    private final int blockNum;
    private final String packedTrx;
    private final String id;
    private final String compression;
    private final List<Signature> signatures = new ArrayList<>();
    private final JSONObject transaction;
    private final String blockId;

    private TransactionDetail(@NotNull JSONObject raw) throws JSONException {
        blockNum = raw.getInteger("block_num");
        packedTrx = raw.getString("packed_trx");
        id = raw.getString("id");
        compression = raw.getString("compression");
        JSONArray signaturesArray = raw.getJSONArray("signatures");

        for (int i = 0; i < signaturesArray.size(); i++) {
            signatures.add(Signature.of((String) signaturesArray.get(i)));
        }

        transaction = raw.getJSONObject("transaction");
        blockId = raw.getString("block_id");
    }

    @NotNull
    @Contract("_ -> new")
    public static TransactionDetail create(JSONObject raw) throws JSONException {
        Objects.requireNonNull(raw);
        return new TransactionDetail(raw);
    }

    @JSONField(name = "block_num")
    public int getBlockNum() {
        return blockNum;
    }

    @JSONField(name = "packed_trx")
    public String getPackedTrx() {
        return packedTrx;
    }

    public String getId() {
        return id;
    }

    public String getCompression() {
        return compression;
    }

    public List<Signature> getSignatures() {
        return signatures;
    }

    public JSONObject getTransaction() {
        return transaction;
    }

    @JSONField(name = "block_id")
    public String getBlockId() {
        return blockId;
    }
}