package com.pingcap.kb.integration.endpoint;

import com.pingcap.kb.integration.config.JiraConfiguration;
import com.pingcap.kb.integration.kb.KbClient;
import com.pingcap.kb.integration.service.IntegrationService;
import com.pingcap.kb.integration.service.JiraService;
import com.pingcap.kb.integration.service.KbService;
import com.pingcap.kb.integration.service.KbService.RenderContext;
import com.pingcap.kb.integration.service.MailService;
import java.io.IOException;
import javax.mail.MessagingException;
import lombok.AllArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@AllArgsConstructor
@RequestMapping("/api")
@RestController
public class RestEndpoints {

  private final JiraConfiguration jiraConfiguration;
  private final JiraService jiraService;
  private final KbService kbService;
  private final KbClient kbClient;
  private final MailService mailService;
  private final IntegrationService integrationService;

  @Scheduled(cron = "${jira.poll-cron}")
  @PostMapping("jira/run-task")
  public void runJiraTask() {
    jiraService.findIssues().forEachRemaining(integrationService::trackIssue);
  }

  @Scheduled(cron = "${jira.poll-cron}")
  @PostMapping("jira/run-legacy-task")
  public void runLegacyJiraTask() {
    jiraService.findLegacyIssues().forEachRemaining(integrationService::trackIssue);
  }

  @PostMapping("kb/run-legacy-task")
  public void runKbTask() {
    kbService.findSolutions((client, page) -> client.getSolutionsWithBackTrackLink(jiraConfiguration.getProject(), page)).forEach(integrationService::trackSolution);
  }

  @PostMapping(value = "kb/mail/{id}/{template}", produces = MediaType.TEXT_HTML_VALUE)
  public void render(@PathVariable String template, @PathVariable Long id, @RequestParam String to) throws IOException, MessagingException {
    RenderContext ctx = new RenderContext();
    String body = kbService.renderTemplate(template, kbClient.getSolution(id, true).orElseThrow(), ctx);
    String title = ctx.getTitle();
    mailService.send(to, title, body);
  }

}
