package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.entity.dto.NewProductApplyQueryDTO;
import com.haha.entity.dto.NewProductApplySubmitDTO;
import com.haha.entity.NewProductApply;

import java.util.Map;

/**
 * 新品申请服务接口
 */
public interface NewProductApplyService extends IService<NewProductApply> {

    /**
     * 分页查询新品申请列表
     *
     * @param page     页码
     * @param pageSize 每页条数
     * @param queryDTO   查询参数
     * @return 分页结果
     */
    IPage<NewProductApply> getPage(int page, int pageSize, NewProductApplyQueryDTO queryDTO);

    /**
     * 提交新品申请（DTO版本）
     * 将DTO转为实体，保存到本地数据库，并调用哈哈平台API提交申请
     *
     * @param dto             申请信息
     * @param applicantId     申请人ID
     * @param applicantName   申请人名称
     * @return 申请记录ID
     */
    Long submitApply(NewProductApplySubmitDTO dto, Long applicantId, String applicantName);

    /**
     * 保存草稿（DTO版本）
     *
     * @param dto             申请信息
     * @param applicantId     申请人ID
     * @param applicantName   申请人名称
     * @return 申请记录ID
     */
    Long saveDraft(NewProductApplySubmitDTO dto, Long applicantId, String applicantName);

    /**
     * 更新申请（DTO版本）
     *
     * @param id   申请ID
     * @param dto  申请信息
     */
    void updateApply(Long id, NewProductApplySubmitDTO dto);

    /**
     * 提交新品申请
     * 将申请信息保存到本地数据库，并调用哈哈平台API提交申请
     *
     * @param apply           申请信息
     * @param applicantId     申请人ID
     * @param applicantName   申请人名称
     * @return 申请记录ID
     */
    Long submitApply(NewProductApply apply, Long applicantId, String applicantName);

    /**
     * 根据哈哈平台回调更新申请状态
     *
     * @param hahaApplyId 哈哈平台工单编号
     * @param status      状态：2已通过，3已拒绝
     * @param hahaCode    哈哈平台商品code（审核通过时）
     * @param rejectReason 拒绝原因
     */
    void updateByCallback(String hahaApplyId, Integer status, String hahaCode, String rejectReason);

    /**
     * 获取申请统计信息
     *
     * @return 统计信息
     */
    Map<String, Object> getStatistics();

    /**
     * 查询商品总库中是否存在该条码的商品
     *
     * @param barcode 商品条码
     * @return 商品信息（如果存在返回商品信息，否则返回null）
     */
    Map<String, Object> checkBarcodeInTotalList(String barcode);

    /**
     * 主动查询新品申请审核状态（回调补偿机制）
     *
     * @param code 商品code
     * @param id   新品申请主键id
     * @return 申请状态信息
     */
    Map<String, Object> getNewGoodsInfo(String code, String id);
}
