package com.xhpc.user.service;

import com.xhpc.user.domain.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 用于处理发票相关请求的Service
 *
 * @author WH
 * @date 2021/12/20 14:04
 * @since version-1.0
 */
public interface XhpcInvoiceService {

    /**
     * 通过发票id查询指定发票信息，用于回显
     *
     * @param invoiceId 指定的发票id
     * @return 一个保存着所有返回需要的信息的包装类
     * @author WH
     * @date 2021/12/20 14:10
     * @since version-1.0
     */
    SpecificInvoiceWrap findSpecificInvoice(Long invoiceId);

    /**
     * 通过requestData中的申请人、申请人类型、发票状态、发票起始时间、发票申请终止时间、开票起始时间、开票终点时间、当前所在页数、当前页所要显示几行，来查询发票列表信息
     *
     * @param requestData 传递过来的查询参数
     * @return AllInvoiceOrdersResponse 发票列表对象
     * @author WH
     * @date 2021/12/21 16:02
     * @since version-1.0
     */
    AllInvoiceOrdersResponse findAllInvoiceOrders(AllInvoiceOrdersRequest requestData);

    /**
     * 存储开发票的状态，将开票信息入库，并向指定用户的邮箱发送短信
     *
     * @param requestData 要入库的信息
     * @return Boolean 成功还是失败
     * @author WH
     * @date 2021/12/22 14:59
     * @since version-1.0
     */
    Boolean invoiceToUser(InvoiceToUserRequest requestData);

    /**
     * 存储发票开失败的状态，将其发票状态设置为取消开票状态
     *
     * @param requestData 开票失败所传递的参数
     * @author WH
     * @date 2021/12/23 12:48
     * @since version-1.0
     */
    void failInvoiceToUser(InvoiceToUserRequest requestData);

    /**
     * 查询发票抬头信息
     *
     * @param firmName 公司名称
     * @return 公司名称以及对应的税号
     * @author WH
     * @date 2021/12/23 15:29
     * @since version-1.0
     */
    InvoiceTitleResponse findTitleInfo(String firmName);

    /**
     * 查询用户输入的最后一次的开发票所填写的信息
     *
     * @param creatorId   用户id
     * @param creatorType 用户类型
     * @return 要回显的数据
     * @author WH
     * @date 2021/12/23 17:23
     * @since version-1.0
     */
    TitleResponse findUserLastInputInfo(Long creatorId, Integer creatorType);

    /**
     * 根据用户id，用户类型，要查询的当前时间的年月日，查询该用户3个月内可以开发票的订单
     *
     * @param invoicedOrdersRequest 查询条件
     * @return 要返回的数据的封装类
     * @author WH
     * @date 2021/12/24 10:42
     * @since version-1.0
     */
    InvoicedOrderResponse findUserHistoryOrders(InvoicedOrdersRequest invoicedOrdersRequest);

    /**
     * 根据发票id，查询回显发票所需要的数据
     *
     * @param invoiceId 发票id
     * @return 数据封装对象
     * @author WH
     * @date 2021/12/27 13:12
     * @since version-1.0
     */
    SpecificInvoicedResponse findSpecificInvoicedInfo(Long invoiceId);

    /**
     * 根据前端传递过来的请求参数，查询所需要的开发票历史记录
     *
     * @param invoiceHistoryRecordsRequest 请求参数
     * @return 所需要的开发票历史记录
     * @author WH
     * @date 2021/12/27 14:49
     * @since version-1.0
     */
    InvoiceHistoryRecordsResponse findInvoiceHistoryRecords(InvoiceHistoryRecordsRequest invoiceHistoryRecordsRequest);

    /**
     * 将用户申请的发票信息，保存到数据库中
     *
     * @param saveInvoiceInfoRequest 发票信息
     * @throws Exception 传入发票金额参数与内部该发票所包含的所有订单金额参数不一致出现，出现此异常
     * @author WH
     * @date 2021/12/28 14:33
     * @since version-1.0
     */
    void saveInvoiceInfo(SaveInvoiceInfoRequest saveInvoiceInfoRequest) throws Exception;

    /**
     * 查询指定用户没有查看的已开的发票的数量，即该用户有几个未读发票
     *
     * @param creatorId   用户id
     * @param creatorType 用户类型
     * @return 未读发票数量
     * @author WH
     * @date 2021/12/28 19:01
     * @since version-1.0
     */
    Long findNotReadCount(Long creatorId, Integer creatorType);

    /**
     * 导出所有发票记录（已开与未开）到Excel中
     *
     * @param invoiceIds 发票id
     * @param response   响应的response
     * @throws IOException 该Response对象不存在时，抛出该异常对象
     * @author WH
     * @date 2021/12/30 10:16
     * @since version-1.0
     */
    void exportExcel(List<String> invoiceIds, HttpServletResponse response) throws IOException;

    /**
     * 查询是否有未开票的订单
     * @return
     */
    int getInvoiceInfo();

}
