package jnpf.attendance.service;

import com.github.pagehelper.PageInfo;
import jnpf.base.UserInfo;
import jnpf.entity.attendance.AttendanceMachineManage;
import jnpf.entity.attendance.AttendanceUserFace;
import jnpf.exception.HandleException;
import jnpf.model.attendance.dto.FaceChangeQueryDto;
import jnpf.model.attendance.dto.FaceQueryDto;
import jnpf.model.attendance.dto.UserDto;
import jnpf.model.attendance.dto.UserFaceDto;
import jnpf.model.attendance.vo.ChangeLogVo;
import jnpf.model.attendance.vo.FaceMiniVo;
import jnpf.model.attendance.vo.UserFaceDetailVo;
import jnpf.model.attendance.vo.UserFaceVo;
import jnpf.model.common.PageDto;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Map;

/**
 * 人脸识别服务
 *
 * @author yanwenfu
 * @create 2025-04-08
 */
public interface UserFaceService {

    /**
     * 人脸对比
     * @param file 人脸图片
     * @param userInfo 用户信息
     * @return java.lang.Boolean
     */
    Boolean getPhotoCheck(MultipartFile file, UserInfo userInfo) throws HandleException;

    /**
     * 保存人脸信息
     * @param userDto 用户信息
     * @param userInfo 登录人信息
     * @param faceUrl 人脸url
     * @param thumbnailUrl 缩略图url
     */
    void saveUserFace(UserDto userDto, UserInfo userInfo, String faceUrl, String thumbnailUrl);

    /**
     * 清空人脸
     * @param userId 用户id
     */
    void deleteUserFace(String userId, UserInfo userInfo) throws Exception;

    /**
     * 查看人脸
     * @param userId 用户id
     * @return jnpf.model.attendance.vo.UserFaceVo
     */
    UserFaceVo getUserFace(String userId);

    /**
     * 变动记录(分页)
     * @param queryDto 查询条件
     * @return com.github.pagehelper.PageInfo<jnpf.model.attendance.vo.ChangeLogVo>
     */
    PageInfo<ChangeLogVo> getChangeLogPage(FaceChangeQueryDto queryDto);

    /**
     * 人脸记录(分页)
     * @param queryDto 查询条件
     * @return com.github.pagehelper.PageInfo<jnpf.model.attendance.vo.UserFaceDetailVo>
     */
    PageInfo<UserFaceDetailVo> getUserFacePage(FaceQueryDto queryDto);

    Map<String, List<AttendanceMachineManage>> getUserFaceList(List<String> userIds, String tenantId);

    /**
     * 判断用户是否上传人脸
     * @param userId 用户id
     * @return java.lang.Boolean
     */
    Boolean hasUserFace(String userId);

    /**
     * 用户人脸信息
     * @param userId 用户id
     * @return jnpf.model.attendance.vo.FaceMiniVo
     */
    FaceMiniVo getUserFaceInfo(String userId);

    /**
     * 查看人脸详情
     * @param id 人脸记录id
     * @return jnpf.model.attendance.vo.UserFaceVo
     */
    UserFaceVo getUserFaceDetail(String id);

    /**
     * 初始化人脸
     **/
    void initializationFace( String tenantId);

    /**
     * 更新用户人脸信息
     * @param userId 用户id
     * @param updateUserId 更新人id
     */
    AttendanceUserFace updateUserFaceInfo(String userId, String updateUserId);

    /**
     * 下发到考勤机
     * @param userId 用户id
     * @return java.lang.Integer
     */
    Integer sendToMachine(String userId) throws Exception;

    /**
     * 更新考勤机返回的状态
     * @param userId 用户id
     * @param result 1: 成功, 0: 失败
     */
    void updateMachineSyncStatus(String userId, Integer result);
}
