package dev.elaine.datalab.mybatis;

import dev.elaine.datalab.domain.Order;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

public interface OrderMapper {
  @Insert("""
      INSERT INTO orders(id, user_id, status, amount, version)
      VALUES(#{id}, #{userId}, #{status}, #{amount}, #{version})
      """)
  int insert(Order order);

  @Select("SELECT id, user_id, status, amount, version FROM orders WHERE id = #{id}")
  Order findById(long id);

  @Select("""
      SELECT id, user_id, status, amount, version
      FROM orders WHERE user_id = #{userId} AND id > #{afterId}
      ORDER BY id LIMIT #{size}
      """)
  List<Order> seekPage(@Param("userId") long userId,
                       @Param("afterId") long afterId,
                       @Param("size") int size);

  @Update("""
      UPDATE orders SET status = #{newStatus}, version = version + 1
      WHERE id = #{id} AND version = #{expectedVersion}
      """)
  int updateStatus(@Param("id") long id,
                   @Param("expectedVersion") int expectedVersion,
                   @Param("newStatus") String newStatus);
}
