package com.xjrsoft.module.student.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
import com.xjrsoft.module.hikvision.entity.HikvisionData;
import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
import com.xjrsoft.module.hikvision.util.ApiUtil;
import com.xjrsoft.module.outint.vo.IdCountVo;
import com.xjrsoft.module.student.entity.StudentLeave;
import com.xjrsoft.module.student.mapper.StudentLeaveMapper;
import com.xjrsoft.module.student.service.IStudentLeaveService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @title: 学生请假
 * @Author dzx
 * @Date: 2024年5月21日
 * @Version 1.0
*/
@Service
@AllArgsConstructor
public class StudentLeaveServiceImpl extends MPJBaseServiceImpl<StudentLeaveMapper, StudentLeave> implements IStudentLeaveService {

    private final HikvisionDataMapper hikvisionDataMapper;

    @Override
    public Boolean hikvisionLeave(Long id) {
        StudentLeave studentLeave = this.getById(id);

        //查询学生在海康的id
        HikvisionData hikvisionData = hikvisionDataMapper.selectOne(
            new QueryWrapper<HikvisionData>().lambda()
            .eq(HikvisionData::getSourceId, studentLeave.getStudentUserId())
            .eq(HikvisionData::getTableName, "base_student")
        );
        ApiUtil apiUtil = new ApiUtil();
        String apiPath = "/api/acps/v1/auth_config/add";

        String outputFormat = "yyyy-MM-dd'T'HH:mm:ss+08:00";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(outputFormat);
        JsonObject paramJson = new JsonObject();

        paramJson.addProperty("startTime", studentLeave.getStartDate().atStartOfDay().format(formatter));
        paramJson.addProperty("endTime", studentLeave.getEndDate().atTime(23,59,59).format(formatter));

        //组装人员数据
        JsonArray personDatas = new JsonArray();
        JsonObject personData = new JsonObject();
        personData.addProperty("personDataType", "person");

        JsonArray indexCodes = new JsonArray();
        indexCodes.add(hikvisionData.getHikvisionId());
        personData.add("indexCodes", indexCodes);

        personDatas.add(personData);
        paramJson.add("personDatas", personDatas);

        JsonArray resourceInfos = selectResource(apiUtil);
        paramJson.add("resourceInfos", resourceInfos);

        Map<String, String> header = new HashMap<>();
        header.put("tagId", "studentleave");
        //调用接口获取到返回内容，并将其存到数据库中
        String result = apiUtil.doPost(apiPath, paramJson.toString(), null, header);
        studentLeave.setHikvisionResult(result);
        this.updateById(studentLeave);
        return true;
    }

    @Override
    public Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime, AttendanceStatisticDto dto) {
        return this.baseMapper.getLeaveCount(startTime, endTime, dto);
    }

    @Override
    public Map<Long, Integer> getClassLeaveCount(LocalDateTime startTime, LocalDateTime endTime) {
        List<IdCountVo> classLeaveCount = this.baseMapper.getClassLeaveCount(startTime, endTime);
        Map<Long, Integer> result = new HashMap<>();
        for (IdCountVo idCountVo : classLeaveCount) {
            result.put(idCountVo.getId(), idCountVo.getCount());
        }
        return result;
    }

    @Override
    public Map<Long, StudentLeave> getLeaveList(LocalDateTime startTime, LocalDateTime endTime) {
        List<StudentLeave> leaveList = this.baseMapper.getLeaveList(startTime, endTime);
        Map<Long, StudentLeave> result = new HashMap<>();
        for (StudentLeave studentLeave : leaveList) {
            result.put(studentLeave.getClassId(), studentLeave);
        }
        return result;
    }

    JsonArray selectResource(ApiUtil apiUtil){
        String apiPath = "/api/irds/v2/resource/resourcesByParams";
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("pageNo", 1);
        jsonObject.addProperty("pageSize", 500);
        jsonObject.addProperty("resourceType", "door");

        String result = apiUtil.doPost(apiPath, jsonObject.toString(), null, null);
        JsonParser parser = new JsonParser();
        JsonObject resultJson = parser.parse(result).getAsJsonObject();
        JsonArray resourceInfos = new JsonArray();

        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
            JsonArray list = resultJson.get("data").getAsJsonObject().get("list").getAsJsonArray();
            for (JsonElement jsonElement : list) {
                JsonObject listOne = jsonElement.getAsJsonObject();
                JsonObject resourceInfo = new JsonObject();
                resourceInfo.add("resourceIndexCode", listOne.get("indexCode"));
                resourceInfo.add("resourceType", listOne.get("resourceType"));
                JsonArray channelNos = new JsonArray();
                channelNos.add(listOne.get("channelNo"));
                resourceInfo.add("channelNos", channelNos);
                resourceInfos.add(resourceInfo);
            }
        }

        return resourceInfos;
    }
}
