package com.pingcap.kb.integration.dao;

import com.pingcap.kb.integration.entity.KbPostStatus;
import java.util.Optional;
import java.util.stream.Stream;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
public class KbPostStatusDao {
  private final JdbcTemplate jdbcTemplate;
  private final static String SQL_EXISTS = "select * from kb_post_status where kb_type = ? and kb_id = ?";
  private final static String SQL_INSERT = "insert into kb_post_status (kb_type, kb_id, status, tracking) values (?, ?, ?, ?)";
  private final static String SQL_SET_TRACK = "update kb_post_status set tracking = ? where kb_type = ? and kb_id = ?";
  private final static String SQL_FIND_ALL = "select * from kb_post_status where kb_type = ? and tracking = ?";

  public KbPostStatusDao(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
  }

  public Optional<KbPostStatus> find(String service, Long id) {
    return jdbcTemplate.query(SQL_EXISTS, KbPostStatus.ROW_MAPPER, service, id).stream().findFirst();
  }

  @Transactional
  public KbPostStatus create(String service, Long id, Integer status, boolean tracking) {
    var cur = find(service, id);
    if (cur.isPresent()) {
      throw new RuntimeException("already exists");
    }
    jdbcTemplate.update(SQL_INSERT, service, id, status, tracking);
    return find(service, id).orElseThrow();
  }

  @Transactional
  public void setTrack(String service, Long id, boolean tracking) {
    jdbcTemplate.update(SQL_SET_TRACK, tracking, service, id);
  }

  public Stream<KbPostStatus> findAll(String service, boolean tracking) {
    return jdbcTemplate.queryForStream(SQL_FIND_ALL, KbPostStatus.ROW_MAPPER, service, tracking);
  }

}
