package com.oanda.v20.order;

import java.io.IOException;

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

import com.oanda.v20.primitives.StringPrimitive;
import com.oanda.v20.transaction.TransactionID;

/**
 * The specification of an Order as referred to by clients
 * <p>
 * Either the Order's OANDA-assigned OrderID or the Order's client-provided
 * ClientID prefixed by the "@" symbol
 */
@JsonAdapter(OrderSpecifier.JsonAdapter.class)
public class OrderSpecifier extends StringPrimitive {

    /**
     * OrderSpecifier copy constructor.
     * <p>
     * @param orderSpecifier the 
     */
    public OrderSpecifier(OrderSpecifier orderSpecifier)
    {
        super(orderSpecifier.toString());
    }

    /**
     * OrderSpecifier constructor.
     * <p>
     * @param orderSpecifier the OrderSpecifier as a String
     */
    public OrderSpecifier(String orderSpecifier) {
        super(orderSpecifier);
    }

    /**
     * Construct an OrderSpecifier from an OrderID
     * <p>
     * @param orderID the OrderID to convert
     */
    public OrderSpecifier(OrderID orderID) {
        super(orderID.toString());
    }

    /**
     * Construct an OrderSpecifier from a TransactionID
     * <p>
     * @param transactionID the TransactionID to convert
     */
    public OrderSpecifier(TransactionID transactionID) {
        super(transactionID.toString());
    }

    /**
     * JSON adapter for reading and writing OrderSpecifier0
     */
    public static class JsonAdapter extends TypeAdapter<OrderSpecifier> {

        @Override
        public OrderSpecifier read(JsonReader in) throws IOException {
            return new OrderSpecifier(in.nextString());
        }

        @Override
        public void write(JsonWriter out, OrderSpecifier obj) throws IOException {
            out.value(obj.toString());
        }
    }
}