package com.xhpc.user.mapper;

import com.xhpc.user.domain.AllInvoiceOrdersRequest;
import com.xhpc.user.domain.ExcelInvoiceRow;
import com.xhpc.user.domain.InvoiceHistoryRecordsRequest;
import com.xhpc.user.domain.InvoiceToUserRequest;
import com.xhpc.user.pojo.XhpcInvoice;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

public interface XhpcInvoiceMapper {

    int deleteByPrimaryKey(Long invoiceId);

    int insert(XhpcInvoice record);

    int insertSelective(XhpcInvoice record);

    /**
     * 通过发票id查询发票信息
     *
     * @param invoiceId 发票id
     * @return 发票信息实体类
     * @author WH
     * @date 2021/12/20 17:18
     * @since version-1.0
     */
    XhpcInvoice selectByPrimaryKey(Long invoiceId);

    int updateByPrimaryKeySelective(XhpcInvoice record);

    int updateByPrimaryKey(XhpcInvoice record);

    /**
     * 通过条件来查询每个发票的信息，然后返回
     *
     * @param requestData 查询条件
     * @return List<XhpcInvoice> 装着指定记录的信息
     * @author WH
     * @date 2021/12/21 16:13
     * @since version-1.0
     */
    List<XhpcInvoice> selectAllInvoiceOrdersByCondition(AllInvoiceOrdersRequest requestData);

    /**
     * 通过条件查询当前发票的总个数，然后返回
     *
     * @param requestData 查询条件
     * @return Long 发票总个数
     * @author WH
     * @date 2021/12/22 10:01
     * @since version-1.0
     */
    Long sumItemsInvoice(AllInvoiceOrdersRequest requestData);

    /**
     * 查询所有已开发票的总金额
     *
     * @return BigDecimal 所有已开发票的总金额
     * @author WH
     * @date 2021/12/22 11:45
     * @since version-1.0
     */
    BigDecimal allInvoicedMoney();

    /**
     * 查询所有未开发票的总金额
     *
     * @return BigDecimal 所有未开发票的总金额
     * @author WH
     * @date 2021/12/22 11:53
     * @since version-1.0
     */
    BigDecimal allNotInvoicedMoney();

    /**
     * 更新指定发票状态，让其成为已开发票状态，并设置用户未阅读标签
     *
     * @param requestData 更新数据的来源
     * @return Long 返回更新受影响的条数
     * @author WH
     * @date 2021/12/22 15:07
     * @since version-1.0
     */
    Long updateInvoiceToUser(InvoiceToUserRequest requestData);

    /**
     * 更新指定发票状态，让其成为开发票失败状态
     *
     * @param requestData 更新数据的来源
     * @return Long 返回受影响的行数
     * @author WH
     * @date 2021/12/23 13:30
     * @since version-1.0
     */
    Long updateFailInvoiceToUser(InvoiceToUserRequest requestData);

    /**
     * 模糊查询指定公司名称和税号
     *
     * @param firmName 公司名称
     * @return 返回几个公司的名称和税号
     * @author WH
     * @date 2021/12/23 15:54
     * @since version-1.0
     */
    List<XhpcInvoice> selectInvoiceTitleInfo(String firmName);

    /**
     * 查询用户最近一次提交发票的发票信息
     *
     * @param creatorId   用户id
     * @param creatorType 用户类型
     *
     * @return 最近一次提交的发票信息
     * @author WH
     * @date 2021/12/23 17:29
     * @since version-1.0
     */
    XhpcInvoice selectUserLastInputInvoiceInfo(@Param("creatorId") Long creatorId, @Param("creatorType") Integer creatorType);

    /**
     * 查询用户提交的发票记录，通过用户id、用户类型来进行查询
     *
     * @param invoiceHistoryRecordsRequest 请求参数包装类
     * @return 返回用户提交的发票记录
     * @author WH
     * @date 2021/12/27 15:30
     * @since version-1.0
     */
    List<XhpcInvoice> findInvoicesByCreatorIdAndCreatorType(InvoiceHistoryRecordsRequest invoiceHistoryRecordsRequest);

    /**
     * 获取用户发票条数，根据用户id和用户类型
     *
     * @param creatorId   用户id
     * @param creatorType 用户类型
     *
     * @return 用户发票条数
     * @author WH
     * @date 2021/12/27 16:47
     * @since version-1.0
     */
    Long getUserInvoiceItemsByCreatorIdAndCreatorType(@Param("creatorId") Long creatorId, @Param("creatorType") Integer creatorType);

    /**
     * 插入发票记录，获取所插入的发票记录的发票id（会被放置到实体类id属性中）
     *
     * @param xhpcInvoice 发票记录
     * @author WH
     * @date 2021/12/28 15:09
     * @since version-1.0
     */
    void insertSelectiveAndReturnId(XhpcInvoice xhpcInvoice);

    /**
     * 查找指定用户开了的发票未读的数量
     *
     * @param creatorId   用户id
     * @param creatorType 用户类型
     * @return 返回发票未读的数量
     * @author WH
     * @date 2021/12/28 20:31
     * @since version-1.0
     */
    Long findNotReadCount(@Param("creatorId") Long creatorId, @Param("creatorType") Integer creatorType);

    /**
     * 更新发票状态，从未读变成已读
     *
     * @param invoiceId 要更新的发票id
     * @author WH
     * @date 2021/12/29 17:26
     * @since version-1.0
     */
    void updateByInvoiceId(Long invoiceId);

    /**
     * 获取发票内容
     *
     * @param invoiceId 发票id
     * @return 专门用于放置到Excel中Map
     * @author WH
     * @date 2021/12/30 18:08
     * @since version-1.0
     */
    List<ExcelInvoiceRow> selectExcelInvoiceById(Long invoiceId);

    /**
     * 更新发票所包含的电量总金额，服务费总金额
     *
     * @param xhpcInvoice 存放要更新数据的实体类
     * @author WH
     * @date 2022/1/3 17:06
     * @since version-1.0
     */
    void updateElectricAndServiceById(XhpcInvoice xhpcInvoice);

    int getInvoiceInfo();

}