defmodule Ibex.Contracts.Storage do
  use GenServer
  require Logger
  @initial_state %{contracts: %{}}
  def start_link(_) do
    Logger.info("Starting Inbound as a supervised process...")
    GenServer.start_link(__MODULE__, @initial_state, name: __MODULE__)
  end

  def init(state) do
    {:ok, table_name} = :dets.open_file(:disk_storage, [type: :set])
    state = Map.put(state, :dets_table, table_name)
    {:ok, state}
  end

  def handle_info({:add_contract, contract_description}, state) do
    symbol = contract_description.contract.symbol
    case :dets.lookup(state[:dets_table], symbol) do
      [{^symbol, value}] ->
        Logger.info("Appending contract to symbol #{symbol}")
        value = Map.put(value, contract_description.contract.con_id, contract_description)
        :dets.insert(state[:dets_table], {symbol, value})
      [] ->
        Logger.info("First contract for symbol #{contract_description.contract.symbol}")
        :dets.insert(state[:dets_table], {contract_description.contract.symbol, %{}})
    end

    {:noreply, state}
  end

  def handle_call({:get_table_name}, _from, state) do
    {:reply, state[:dets_table], state}
  end

end