package com.matter.tv.server.service;

import android.util.Log;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class ResponseRegistry {

  private static final String TAG = "ResponseRegistry";

  private AtomicInteger messageCounter = new AtomicInteger();

  private Map<Integer, String> responses = new ConcurrentHashMap<>();

  private Map<Integer, CountDownLatch> latches = new ConcurrentHashMap<>();

  public int getNextMessageCounter() {
    int counter = messageCounter.incrementAndGet();
    // MAX_VALUE used for error scenarios
    if (counter == Integer.MAX_VALUE) {
      counter = messageCounter.incrementAndGet();
    }
    latches.put(counter, new CountDownLatch(1));
    return counter;
  }

  public void waitForMessage(int counter, long timeout, TimeUnit unit) {
    CountDownLatch latch = latches.get(counter);
    if (latch == null) {
      return;
    }
    try {
      if (!latch.await(timeout, unit)) {
        Log.i(TAG, "Timed out while waiting for response for message " + counter);
      }
    } catch (InterruptedException e) {
      Log.i(TAG, "Interrupted while waiting for response for message " + counter);
    }
  }

  public void receivedMessageResponse(int counter, String response) {
    CountDownLatch latch = latches.remove(counter);
    if (latch == null) {
      // no point adding response to memory if no one is going to read it.
      return;
    }
    responses.put(counter, response);
    latch.countDown();
  }

  public String readAndRemoveResponse(int counter) {
    // caller should manage null values
    return responses.remove(counter);
  }
}
