package com.bonus.canteen.core.notice.hawkeye.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.DesensitizedUtil.DesensitizedType;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.servlet.JakartaServletUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bonus.canteen.core.auth.api.MgrUserApi;
import com.bonus.canteen.core.notice.hawkeye.mapper.AllocLogRecordMapper;
import com.bonus.common.houqin.utils.id.Id;
import com.google.common.collect.Lists;
import javax.servlet.http.HttpServletRequest;
import com.bonus.canteen.core.common.encrypt.SM4EncryptUtils;
import com.bonus.canteen.core.common.enums.FileUploadSourceEnum;
import com.bonus.canteen.core.common.redis.RedisUtil;
import com.bonus.canteen.core.common.utils.AesEncryptUtil;
import com.bonus.canteen.core.common.utils.SysUtil;
import com.bonus.canteen.core.notice.hawkeye.model.AllocLogRecord;
import com.bonus.canteen.core.notice.hawkeye.param.AllocLogRecordParam;
import com.bonus.canteen.core.notice.hawkeye.service.AllocLogRecordService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;

@Service
public class AllocLogRecordServiceImpl extends ServiceImpl<AllocLogRecordMapper, AllocLogRecord> implements AllocLogRecordService {
   private static final Logger log = LoggerFactory.getLogger(AllocLogRecordServiceImpl.class);
   @Autowired
   @Lazy
   private MgrUserApi mgrUserApi;
//   @Autowired
//   private OssProperties ossProperties;
//   @Autowired
//   private OssTemplate ossTemplate;
//   @Autowired
//   private AesEncryptUtil aesEncryptUtil;
   private static final String GEN_LOG_EXCEL_KEY = "yst:merchantId:userId:gen:allocLog:excel";
   private static final String DOWNLOAD_LOG_EXCEL_URL_KEY = "yst:merchantId:userId:download:allocLog:excel:url";
   private static final String USER_ID = "user_id";

//   public Page<AllocLogRecord> pageLogRecord(AllocLogRecordParam param) {
//      param.setLoginUserName(LeBeanUtil.fieldLikeHandle(param.getLoginUserName()));
//      Page<AllocLogRecord> page = new Page(param.getCurrent(), param.getSize());
//      Page<AllocLogRecord> recordPage = ((AllocLogRecordMapper)this.baseMapper).pageLogRecord(page, param);
//      recordPage.getRecords().forEach((allocLogRecord) -> {
//         allocLogRecord.setLoginUserPhone(SM4EncryptUtils.desensitizedByConfig(allocLogRecord.getLoginUserPhone(), DesensitizedType.MOBILE_PHONE));
//      });
//      return recordPage;
//   }

//   public void saveLogRecord(AllocLogRecord logRecord) {
//      if (!"admin".equals(logRecord.getLoginUserName())) {
//         if (ObjectUtil.isNotNull(logRecord.getLogRecordId())) {
//            logRecord.setLoginUserPhone(this.mgrUserApi.getPhoneByUserId(logRecord.getLogRecordId()));
//            if (ObjectUtil.isNotEmpty(logRecord.getLoginUserPhone())) {
//               logRecord.setLoginUserPhoneSuffix(logRecord.getLoginUserPhone().substring(logRecord.getLoginUserPhone().length() - 4));
//            }
//         }
//
//         logRecord.setLogRecordId(Id.next());
//         ((AllocLogRecordMapper)this.baseMapper).insert(logRecord);
//      }
//   }

//   public void saveLogRecordForCustom(AllocLogRecord logRecord) {
//      HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
//      //logRecord.setLoginIp(JakartaServletUtil.getClientIP(request, new String[0]));
//      logRecord.setCrby(logRecord.getLoginUserName());
//      logRecord.setCrtime(LocalDateTime.now());
//      this.saveLogRecord(logRecord);
//   }

//   public void genLogRecordExcelFile(AllocLogRecordParam param) {
//      Long userId = (Long)SecureManager.getSubjectId().get();
//      Long merchantId = TenantContextHolder.getTenantId();
//      String key = "yst:merchantId:userId:gen:allocLog:excel".replace("merchantId", merchantId.toString()).replace("user_id", userId.toString());
//      String downLoadKey = "yst:merchantId:userId:download:allocLog:excel:url".replace("merchantId", merchantId.toString()).replace("user_id", userId.toString());
//      if (ObjectUtil.isNotEmpty(RedisUtil.getString(key))) {
//         throw new LeException(I18n.getMessage("notice_alloc_log_record_gen_excel_file_wait_exception", new Object[0]));
//      } else if (ObjectUtil.isNotEmpty(RedisUtil.getString(downLoadKey))) {
//         throw new LeException(I18n.getMessage("notice_alloc_log_record_gen_excel_file_done_exception", new Object[0]));
//      } else {
//         RedisUtil.setString(key, "user_id");
//         Executors.doInTenant(merchantId, (status) -> {
//            int maxSize = 10000;
//            ExcelWriter excelWriter = null;
//
//            try {
//               param.setLoginUserName(LeBeanUtil.fieldLikeHandle(param.getLoginUserName()));
//               List<AllocLogRecord> records = ((AllocLogRecordMapper)this.baseMapper).listLogRecord(param);
//               if (!ObjectUtil.isEmpty(records)) {
//                  List<List<AllocLogRecord>> lists = Lists.partition(records, maxSize);
//                  String fileName = this.getFileNameByParam(param);
//                  String var10000 = FileConstants.tempPath;
//                  String filePath = var10000 + TenantContextHolder.getTenantId() + File.separator + "logExcel";
//                  File path = new File(filePath);
//                  if (!path.exists()) {
//                     path.mkdirs();
//                  }
//
//                  String fullFileName = filePath + File.separator + fileName;
//                  log.info("本地excel文件路径：{}", fullFileName);
//                  File excelFile = FileUtil.file(fullFileName);
//                  OutputStream os = FileUtil.getOutputStream(excelFile);
//
//                  try {
//                     excelWriter = EasyExcel.write(os, AllocLogRecord.class).build();
//                     int i = 0;
//
//                     while(true) {
//                        if (i >= lists.size()) {
//                           excelWriter.finish();
//                           break;
//                        }
//
//                        WriteSheet writeSheet = EasyExcel.writerSheet(i, "日志明细" + (i + 1)).build();
//                        List<AllocLogRecord> data = (List)lists.get(i);
//                        excelWriter.write(data, writeSheet);
//                        ++i;
//                     }
//                  } catch (Throwable var29) {
//                     if (os != null) {
//                        try {
//                           os.close();
//                        } catch (Throwable var27) {
//                           var29.addSuppressed(var27);
//                        }
//                     }
//
//                     throw var29;
//                  }
//
//                  if (os != null) {
//                     os.close();
//                  }
//
//                  Long var34 = TenantContextHolder.getTenantId();
//                  String objectName = "" + var34 + "/" + FileUploadSourceEnum.CUST.key() + "/" + fileName;
//                  String bucketName = this.ossProperties.getBucketName();
//                  InputStream inputStream = FileUtil.getInputStream(excelFile);
//
//                  try {
//                     this.ossTemplate.putObject(bucketName, objectName, inputStream);
//                  } catch (Throwable var28) {
//                     if (inputStream != null) {
//                        try {
//                           inputStream.close();
//                        } catch (Throwable var26) {
//                           var28.addSuppressed(var26);
//                        }
//                     }
//
//                     throw var28;
//                  }
//
//                  if (inputStream != null) {
//                     inputStream.close();
//                  }
//
//                  FileUtil.del(excelFile);
//                  RedisUtil.setObj(downLoadKey, SysUtil.getCutFileUrl("/" + bucketName + "/" + objectName));
//                  log.info("系统日志导出生成结束");
//                  return;
//               }
//            } catch (Exception var30) {
//               log.info("生成日志导出文件错误:{}", var30.getMessage(), var30);
//               return;
//            } finally {
//               RedisUtil.delete(key);
//            }
//
//         });
//      }
//   }
//
//   private String getFileNameByParam(AllocLogRecordParam param) {
//      DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
//      StringBuilder sb = new StringBuilder("日志明细");
//      if (ObjectUtil.isNotEmpty(param.getLoginUserName())) {
//         sb.append("_").append(param.getLoginUserName());
//      }
//
//      if (ObjectUtil.isNotEmpty(param.getLoginUserPhone())) {
//         sb.append("_").append(param.getLoginUserPhone());
//      }
//
//      if (ObjectUtil.isNotEmpty(param.getCrtimeStart())) {
//         sb.append("_").append(param.getCrtimeStart().format(df));
//      }
//
//      if (ObjectUtil.isNotEmpty(param.getCrtimeEnd())) {
//         sb.append("_").append(param.getCrtimeEnd().format(df));
//      }
//
//      sb.append("_").append(LocalDateTime.now().format(df));
//      sb.append(".xlsx");
//      return sb.toString();
//   }
//
//   public String getExcelFileUrl() {
//      Long userId = (Long)SecureManager.getSubjectId().get();
//      String key = "yst:merchantId:userId:download:allocLog:excel:url".replace("merchantId", TenantContextHolder.getTenantId().toString()).replace("user_id", userId.toString());
//      Object fileUrl = RedisUtil.getObj(key);
//      if (ObjectUtil.isEmpty(fileUrl)) {
//         throw new LeException(I18n.getMessage("notice_alloc_log_record_get_excel_empty_url_exception", new Object[0]));
//      } else {
//         RedisUtil.delete(key);
//         return (String)fileUrl;
//      }
//   }
}
