package com.ruoyi.system.service.impl;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.uuid.Seq;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.io.FilenameUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.mapper.SysNoticeMapper;
import com.ruoyi.system.service.ISysNoticeService;

import javax.imageio.ImageIO;

/**
 * 公告 服务层实现
 * 
 * @author ruoyi
 */
@Service
public class SysNoticeServiceImpl implements ISysNoticeService
{
    @Autowired
    private SysNoticeMapper noticeMapper;

    /**
     * 查询公告信息
     * 
     * @param noticeId 公告ID
     * @return 公告信息
     */
    @Override
    public SysNotice selectNoticeById(Long noticeId)
    {
        return noticeMapper.selectNoticeById(noticeId);
    }

    /**
     * 查询公告列表
     * 
     * @param notice 公告信息
     * @return 公告集合
     */
    @Override
    public List<SysNotice> selectNoticeList(SysNotice notice)
    {
        return noticeMapper.selectNoticeList(notice);
    }

    /**
     * 新增公告
     * 
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int insertNotice(SysNotice notice)
    {
        return noticeMapper.insertNotice(notice);
    }

    /**
     * 修改公告
     * 
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int updateNotice(SysNotice notice)
    {
        return noticeMapper.updateNotice(notice);
    }

    /**
     * 删除公告对象
     * 
     * @param noticeId 公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeById(Long noticeId)
    {
        return noticeMapper.deleteNoticeById(noticeId);
    }

    /**
     * 批量删除公告信息
     * 
     * @param noticeIds 需要删除的公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeByIds(Long[] noticeIds)
    {
        return noticeMapper.deleteNoticeByIds(noticeIds);
    }

    @Override
    public List<SysNotice> selectAllNotice() {
        return noticeMapper.selectAllNotice();
    }

    @Override
    public SysNotice replaceImg(Long id){
        SysNotice notice = noticeMapper.selectNoticeById(id);
        if(notice==null){
            throw new BaseException("通知不存在");
        }
        String html = notice.getNoticeContent();
        if(StringUtils.isEmpty(html)){
            return notice;
        }
        // 使用Jsoup解析HTML
        Document doc = Jsoup.parse(html);

        // 选择所有的<img>标签
        Elements images = doc.select("img");

        // 遍历所有找到的<img>标签
        for (Element img : images) {
            // 获取当前的src属性值
            String currentSrc = img.attr("src");
            String storeImg = downAndTransfer(currentSrc);
            img.attr("src", storeImg);
            System.out.println("New src: " + img.attr("src"));
        }
        notice.setNoticeContent(doc.html());
        updateNotice(notice);
        return notice;
    }

    public String getImgSrc(String img){
       return  "\\dev-api\\profile\\upload\\2024\\10\\10\\22.jpg";
    }

    //以jpg格式下载远程图片文件
    public String downAndTransfer(String src){
            return downImg(src);
    }

    /**
     * 下载网络文件
     * @param filepath
     * @return
     */
    public String downImg(String filepath){
        // 远程资源存储路径
        String uploadPath = RuoYiConfig.getUploadPath();

        // 下载名称
        String downloadName = StringUtils.substringAfterLast(filepath, "/");
        if(downloadName.contains(".jpeg") ){
            int index = downloadName.lastIndexOf(".jpeg");
            downloadName=downloadName.substring(0,index+5);
        }

        String fileName = StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(downloadName), Seq.getId(Seq.uploadSeqType), getExtension(downloadName));;
                String localFile = uploadPath + "/" + fileName;
        try {
            File file = HttpUtil.downloadFileFromUrl(filepath,FileUtil.file(localFile));
            if (file != null) {
                System.out.println("文件下载成功: " + file.getAbsolutePath());
            } else {
                System.out.println("文件下载失败");
            }
//            FileInputStream fis = new FileInputStream(file);
//            byte[] header = new byte[12];
//            //判断文件是否webp
//            if(fis.read(header)!=-1){
//                throw new BaseException("文件为空或者无法读取");
//            }
//            String fileType = detectImageType(header);
//            System.out.println("文件类型: " + fileType);
//
//
//            if("webp".equals(fileType)){
//
//                String jpgFilePath = "";
//                    System.out.println("WebP文件下载成功: " + file.getAbsolutePath());
//
//                    // 读取WebP文件
//                    BufferedImage bufferedImage = ImageIO.read(file);
//
//                    if (bufferedImage != null) {
//                        // 将WebP文件转换为JPG文件
//                        File jpgFile = new File(jpgFilePath);
//                        Thumbnails.of(bufferedImage)
//                                .outputFormat("jpg")
//                                .toFile(jpgFile);
//
//                        System.out.println("WebP文件转换为JPG文件成功: " + jpgFile.getAbsolutePath());
//                    } else {
//                        System.out.println("无法读取WebP文件");
//                    }
//                } else {
//                    System.out.println("WebP文件下载失败");
//                }

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("下载过程中发生错误: " + e.getMessage());
        }
        return "/dev-api/profile/upload/"+fileName;
    }

    private static String detectImageType(byte[] header) {
        // WebP 文件头
        byte[] webpHeader = { 'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P' };
        // JPG 文件头
        byte[] jpgHeader = { (byte) 0xFF, (byte) 0xD8, (byte) 0xFF, (byte) 0xE0 };

        // 检查是否为 WebP
        if (header[0] == webpHeader[0] && header[1] == webpHeader[1] && header[2] == webpHeader[2] &&
                header[3] == webpHeader[3] && header[8] == webpHeader[8] && header[9] == webpHeader[9] &&
                header[10] == webpHeader[10] && header[11] == webpHeader[11]) {
            return "WebP";
        }

        // 检查是否为 JPG
        if (header[0] == jpgHeader[0] && header[1] == jpgHeader[1] && header[2] == jpgHeader[2] &&
                header[3] == jpgHeader[3]) {
            return "JPG";
        }

        // 如果都不是，返回未知
        return "未知";
    }

    public String getExtension(String filename){
        if(StringUtils.isEmpty(filename)){
            throw new BaseException("文件名为空");
        }
        return FilenameUtils.getExtension(filename);
    }

    @Override
    public void getRandomNotice(){

    }
}
