package com.example.cattletends.repository;

import com.example.cattletends.entity.CattleData;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 牛只数据Repository接口
 */
@Repository
public interface CattleDataRepository extends JpaRepository<CattleData, Integer> {

    /**
     * 根据省份查询牛只数据，按价格升序排序
     *
     * @param province 省份
     * @param sort     排序规则
     * @return 牛只数据列表
     */
    List<CattleData> findByProvince(String province, Sort sort);

    /**
     * 根据品种查询牛只数据，按价格升序排序
     *
     * @param type 品种
     * @param sort 排序规则
     * @return 牛只数据列表
     */
    List<CattleData> findByType(String type, Sort sort);

    /**
     * 根据品种、省份、产地、价格查询牛只数据（用于判断重复）
     * 注意：使用 findFirstBy，避免因为存在多条相同记录导致 NonUniqueResultException
     *
     * @param type     品种
     * @param province 省份
     * @param location 产地
     * @param price    价格
     * @return 第一条匹配的牛只数据（如果存在）
     */
    Optional<CattleData> findFirstByTypeAndProvinceAndLocationAndPrice(
            String type, String province, String location, BigDecimal price);
    
    /**
     * 根据品种和产地查询牛只数据（用于判断重复）
     * 注意：使用 findFirstBy，避免因为存在多条相同记录导致 NonUniqueResultException
     *
     * @param type     品种
     * @param location 产地
     * @return 第一条匹配的牛只数据（如果存在）
     */
    Optional<CattleData> findFirstByTypeAndLocation(String type, String location);
    
    /**
     * 根据品种和产地查询所有匹配的牛只数据（用于删除重复记录）
     * 使用 TRIM 函数来匹配，忽略前后空格
     *
     * @param type     品种
     * @param location 产地
     * @return 所有匹配的牛只数据列表
     */
    @org.springframework.data.jpa.repository.Query("SELECT c FROM CattleData c WHERE TRIM(c.type) = TRIM(?1) AND TRIM(c.location) = TRIM(?2)")
    List<CattleData> findByTypeAndLocation(String type, String location);
    
    /**
     * 获取所有不重复的省份列表
     *
     * @return 省份列表
     */
    @org.springframework.data.jpa.repository.Query("SELECT DISTINCT c.province FROM CattleData c WHERE c.province IS NOT NULL AND c.province != ''")
    List<String> findAllDistinctProvinces();
    
    /**
     * 根据日期范围查询牛只数据（用于删除当天数据）
     *
     * @param startTime 开始时间（当天00:00:00）
     * @param endTime 结束时间（当天23:59:59）
     * @return 该日期范围内的所有数据
     */
    @org.springframework.data.jpa.repository.Query("SELECT c FROM CattleData c WHERE c.createTime >= ?1 AND c.createTime <= ?2")
    List<CattleData> findByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据日期查询当天的牛只数据（用于查询接口）
     * 使用DATE()函数比较日期部分，忽略时间部分
     *
     * @param date 日期（只比较日期部分，忽略时间）
     * @param sort 排序规则
     * @return 当天的数据列表
     */
    @org.springframework.data.jpa.repository.Query("SELECT c FROM CattleData c WHERE DATE(c.createTime) = DATE(?1)")
    List<CattleData> findByCreateTimeDate(LocalDate date, Sort sort);
    
    /**
     * 根据省份和日期查询当天的牛只数据
     *
     * @param province 省份
     * @param date 日期
     * @param sort 排序规则
     * @return 该省份当天的数据列表
     */
    @org.springframework.data.jpa.repository.Query("SELECT c FROM CattleData c WHERE c.province = ?1 AND DATE(c.createTime) = DATE(?2)")
    List<CattleData> findByProvinceAndCreateTimeDate(String province, LocalDate date, Sort sort);
    
    /**
     * 根据品种和日期查询当天的牛只数据
     *
     * @param type 品种
     * @param date 日期
     * @param sort 排序规则
     * @return 该品种当天的数据列表
     */
    @org.springframework.data.jpa.repository.Query("SELECT c FROM CattleData c WHERE c.type = ?1 AND DATE(c.createTime) = DATE(?2)")
    List<CattleData> findByTypeAndCreateTimeDate(String type, LocalDate date, Sort sort);
}

