package org.pankai.tcctransaction.sample.redpacket.domain.repository;

import org.pankai.tcctransaction.sample.redpacket.domain.entity.TradeOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

import java.sql.*;
import java.util.List;

/**
 * Created by pktczwd on 2016/12/20.
 */
@Repository
public class TradeOrderRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void insert(TradeOrder tradeOrder) {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement stmt = connection.prepareStatement("insert into red_trade_order(self_user_id,opposite_user_id,merchant_order_no,amount,status) values(?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
                stmt.setObject(1, tradeOrder.getSelfUserId());
                stmt.setObject(2, tradeOrder.getOppositeUserId());
                stmt.setObject(3, tradeOrder.getMerchantOrderNo());
                stmt.setObject(4, tradeOrder.getAmount());
                stmt.setObject(5, tradeOrder.getStatus());
                return stmt;
            }
        }, keyHolder);
        tradeOrder.setId(keyHolder.getKey().longValue());
    }

    public void update(TradeOrder tradeOrder) {
        jdbcTemplate.update("update red_trade_order set status = ? where id = ?", tradeOrder.getStatus(), tradeOrder.getId());
    }

    public TradeOrder findByMerchantOrderNo(String merchantOrderNo) {
        List<TradeOrder> list = jdbcTemplate.query("select id,self_user_id,opposite_user_id,merchant_order_no,amount,status from red_trade_order where merchant_order_no = ?", new RowMapper<TradeOrder>() {
            @Override
            public TradeOrder mapRow(ResultSet rs, int i) throws SQLException {
                TradeOrder tradeOrder = new TradeOrder();
                tradeOrder.setId(rs.getLong("id"));
                tradeOrder.setSelfUserId(rs.getLong("self_user_id"));
                tradeOrder.setOppositeUserId(rs.getLong("opposite_user_id"));
                tradeOrder.setMerchantOrderNo(rs.getString("merchant_order_no"));
                tradeOrder.setAmount(rs.getBigDecimal("amount"));
                tradeOrder.setStatus(rs.getString("status"));
                return tradeOrder;
            }
        }, merchantOrderNo);
        if (!CollectionUtils.isEmpty(list)) {
            return list.get(0);
        } else {
            return null;
        }
    }

}