package jnpf.certificate.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import jnpf.model.certificate.po.CertificateInstanceEntity;
import jnpf.model.certificate.req.CertificateInstanceAddReq;
import jnpf.model.certificate.req.CertificateHealthManageQueryReq;
import jnpf.model.certificate.req.CertificateInstanceQueryReq;
import jnpf.model.certificate.req.CertificateStoreManageQueryReq;
import jnpf.model.certificate.req.CertificateStoreDashboardReq;
import jnpf.model.certificate.req.CertificateSyncHealthReq;
import jnpf.model.certificate.req.CertificateInstanceUpdateReq;
import jnpf.model.certificate.vo.CertificateHealthManageVO;
import jnpf.model.certificate.vo.CertificateInstanceVO;
import jnpf.model.certificate.vo.CertificateTypeOptionVO;
import jnpf.model.certificate.vo.CertificateStoreManageVO;
import jnpf.model.certificate.vo.CertificateStoreDashboardVO;
import jnpf.model.certificate.vo.CertificateStoreCustomStatusTableVO;
import jnpf.model.certificate.vo.app.HealthCertificateDetailVO;
import jnpf.model.warningnotice.enums.CertificateTypeEnum;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 证照实例服务。
 */
public interface CertificateInstanceService extends IService<CertificateInstanceEntity> {

    /**
     * 新增证照实例。
     *
     * @param req 请求参数
     */
    void add(CertificateInstanceAddReq req);

    /**
     * 更新证照实例。
     *
     * @param req 请求参数
     */
    void update(CertificateInstanceUpdateReq req);

    /**
     * 按ID查询详情。
     *
     * @param id 实例ID
     * @return 详情
     */
    CertificateInstanceVO queryInfo(String id);

    /**
     * 分页查询列表。
     *
     * @param req 查询参数
     * @return 分页结果
     */
    PageInfo<CertificateInstanceVO> queryPage(CertificateInstanceQueryReq req);

    /**
     * 健康证管理分页查询。
     *
     * @param req 查询参数
     * @return 分页结果
     */
    PageInfo<CertificateHealthManageVO> queryHealthPage(CertificateHealthManageQueryReq req);

    /**
     * 门店证照分页查询。
     *
     * @param req 查询参数
     * @return 分页结果
     */
    PageInfo<CertificateStoreManageVO> queryStorePage(CertificateStoreManageQueryReq req);

    /**
     * 逻辑删除。
     *
     * @param id 实例ID
     */
    void delete(String id);

    /**
     * 保存用户的健康证信息
     * @param userId
     * @param healthCertificate
     * @param startHealthDate
     * @param endHealthDate
     */
    void saveHealthCertificate(String userId, String healthCertificate, String startHealthDate, String endHealthDate);

    /**
     * 删除员工健康证
     * @param userId
     */
    void deleteHealthCertificate(String userId);

    /**
     * 根据用户id查询健康证
     * @param userId
     * @return
     */
    Optional<HealthCertificateDetailVO> getHealthCertificateDetail(String userId);

    /**
     * 根据用户id查询健康证
     * @param userIds
     * @return
     */
    List<HealthCertificateDetailVO> getHealthCertificateDetails(Collection<String> userIds);

    /**
     * 根据用户id查询健康证
     * @param userIds
     * @return
     */
    default Map<String, HealthCertificateDetailVO> getHealthCertificateDetailMap(Collection<String> userIds){
        return getHealthCertificateDetails(userIds)
                .stream()
                .collect(Collectors.toMap(HealthCertificateDetailVO::getUserId, v -> v));
    }

    /**
     * 根据状态,证照类型 查询用户id列表
     * @param status
     * @return
     */
    List<String> getUserIdsByStatus(Integer  status,String certificateType);

    /**
     * 查询健康证用户id列表
     * @param status
     * @return
     */
    default List<String> getHealthCertificateUserIdsByStatus(Integer status){
        return getUserIdsByStatus(status, CertificateTypeEnum.HEALTH_CERTIFICATE.getType());
    }
    /**
     * 门店自定义证照看板统计。
     *
     * @param req 查询参数
     * @return 看板统计结果
     */
    CertificateStoreDashboardVO storeCertificateDashboard(CertificateStoreDashboardReq req);

    /**
     * 门店证照看板表格分页查询。
     *
     * @param req 查询参数
     * @return 分页结果
     */
    PageInfo<CertificateStoreCustomStatusTableVO> storeCertificateDashboardTablePage(CertificateStoreDashboardReq req);

    /**
     * 查询证照类型下拉选项。
     *
     * @return 证照类型选项
     */
    List<CertificateTypeOptionVO> queryCertificateTypeList();

    /**
     * 批量初始化员工健康证实例（缺失状态）。
     *
     * @param userIds 员工用户ID集合
     * @return 初始化条数
     */
    int batchInitHealthCertificate(Collection<String> userIds);

    /**
     * 初始化员工健康证实例（缺失状态）。
     *
     * @param userId 员工用户ID
     * @return 是否成功
     */
    default boolean initHealthCertificate(String userId){
        return batchInitHealthCertificate(List.of(userId)) > 0;
    }
}