package com.pingcap.kb.integration.dao;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.relational.core.sql.SQL;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
public class KbPostBindingDao {

  private static final String SQL_CREATE = "insert into kb_post_binding(kb_type, kb_id, ref_app, ref_id) values (?, ?, ?, ?) on duplicate key update kb_id = kb_id";
  private static final String SQL_EXISTS = "select count(*) from kb_post_binding where kb_type = ? and ref_app = ? and ref_id = ?";
  private static final String SQL_FIND = "select ref_id from kb_post_binding where kb_type = ? and kb_id = ? and ref_app = ?";

  private final JdbcTemplate jdbcTemplate;

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

  @Transactional
  public void create(String kbType, Long kbId, String refApp, String refId) {
    jdbcTemplate.update(SQL_CREATE, kbType, kbId, refApp, refId);
  }

  public boolean exists(String kbType, String refApp, String refId) {
    return Boolean.TRUE.equals(jdbcTemplate.queryForObject(SQL_EXISTS, Boolean.class, kbType, refApp, refId));
  }

  public Integer findByKb(String kbType, Long kbId, String refApp) {
    try {
      return jdbcTemplate.queryForObject(SQL_FIND, Integer.class, kbType, kbId, refApp);
    } catch (EmptyResultDataAccessException e) {
      return null;
    }
  }
}
