package J20250804.demo01;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @author WanJl
 * @version 1.0
 * @title FileStatManager
 * @description
 * @create 2025/8/4
 */
public class FileStatManager {
    //文件夹路径
    private String directoryPath;
    //返回的集合列表
    private List<FileStat> results;

    public FileStatManager(String directoryPath) {
        this.directoryPath = directoryPath;
        this.results = new ArrayList<>();
    }
    /**
     * 递归查找文件夹下面的所有的(java)文件
     * @param directory 文件夹路径
     * @return
     */
    private List<File> findAllJavaFiles(File directory){
        //1、创建存所有文件的File对象的集合，
        List<File> javaFiles=new ArrayList<>();
        //获取参数directory文件夹里的所有文件和文件夹组成的数组
        File[] files = directory.listFiles();
        //2、判断当前的文件夹中有没有文件或文件夹
        if (files==null){
            //如果都没有，就把集合返回给调用者
            return javaFiles;
        }
        //3、如果有，就展开文件夹，获取到里面的每一个文件或文件夹
        for (File file: files){
            //5、如果这个File对象，是文件夹，那么调用方法自身，再跳回到第2步，再次执行一轮
            if (file.isDirectory()){
                //那就再使用findAllJavaFiles()操作文件夹，并且把结果添加到集合
                javaFiles.addAll(findAllJavaFiles(file));
            }else if(file.getName().toLowerCase().endsWith(".java")){//4、如果这个File是一个文件，那么就放入集合。
                //我们只处理.java文件
                javaFiles.add(file);
            }
        }
        //6最终返回的是一个集合，集合里面全是Java文件File对象
        return javaFiles;
    }

    /**
     * 开始统计文件
     */
    public void startStatistics() throws IOException, ExecutionException, InterruptedException {
        File directory =new File(directoryPath);
        if (!directory.exists()||!directory.isDirectory()){
            throw new IOException("文件夹不存在或者不是一个文件夹："+directoryPath);
        }
        //获取所有的java文件
        List<File> javaFiles=findAllJavaFiles(directory);
        //判空
        if (javaFiles.isEmpty()){
            System.out.println("没有任何.java文件");
            return;
        }
        //创建线程池，线程池
        //假如你也不知道需要放多大的核心线程数，可以让程序自己计算，计算系统CPU的核心数是多少--邪修 不是正道
        int i = Runtime.getRuntime().availableProcessors();
        ExecutorService executorService = Executors.newFixedThreadPool(i);
        //提交所有任务
        List<Future<FileStat>> futureList=new ArrayList<>();
        //变量存有所有Java文件的集合
        for (File file:javaFiles){
            //提交的任务存入List集合
            futureList.add(
                    //向线程池中提交一个任务
                    executorService.submit(new FileStatTask(file))
            );
        }
        //再遍历任务集合
        for (Future<FileStat> future:futureList){
            //获取每个任务执行的结果，返回值存入到results集合
            results.add(future.get());
        }
        executorService.shutdown();
    }
    /**
     * 把统计结果写入到文件
     */
    public void writeResultsToFile(String outputPath) throws IOException {
        BufferedWriter bw=new BufferedWriter(new FileWriter(outputPath));
        for (FileStat fileStat: results){
            bw.write(fileStat.toString());
            bw.newLine();
            bw.flush();
        }
        bw.close();
    }

    public List<FileStat> getResults() {
        return results;
    }
}
