package com.pingcap.kb.integration.endpoint;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pingcap.kb.integration.kb.Payload;
import com.pingcap.kb.integration.kb.Solution;
import com.pingcap.kb.integration.service.IntegrationService;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Controller;

@AllArgsConstructor
@Slf4j
@Controller("MqEndpoints")
public class MqEndpoints {

  private final IntegrationService integrationService;
  private final ObjectMapper objectMapper;

  public void receive(Message<Map<String, String>> record) throws JsonProcessingException {
    String payload = record.getPayload().get("payload");
    Map<?, ?> map = objectMapper.readValue(payload, Map.class);
    String service = ((Map<String, String>) map.get("params")).get("service");
    Payload<?> payloadObject = switch (service) {
      case "articles" -> objectMapper.readValue(payload, Payload.Article.class);
      case "solutions" -> objectMapper.readValue(payload, Payload.Solution.class);
      default -> throw new IllegalArgumentException("unknown service '" + service + "'");
    };
    handle(service, payloadObject);
  }

  private void handle(String service, Payload<?> payload) {
    if (service.equals("solutions")) {
      if (payload.getAction().equals("post:review")) {
        integrationService.processSolution((Solution) payload.getDomain());
        return;
      }
    }
    log.info("ignore message {} for {}#{}", payload.getAction(), service, payload.getDomain().getId());
  }
}
