package top.r3944realms.docchecktoolrefactored.io.scanner;

import java.nio.file.Path;

/**
 * The interface File scanner.
 */
public interface FileScanner extends AutoCloseable {
    /**
     * 扫描指定路径下的文件
     *
     * @param rootPath 根路径
     * @param listener 文件发现监听器
     */
    default void scan(Path rootPath, FileScanListener listener) {
        throw new UnsupportedOperationException("Please implement FileScanner, FileScannerListener.");
    }
    /**
     * 扫描指定路径下的文件（带进度反馈）
     */
    default void scanWithProgress(Path rootPath, ProgressAwareListener listener) {
        throw new UnsupportedOperationException("Please implement FileScanner, ProgressAwareListener.");
    }
    /**
     * 扫描指定路径下的文件 (带超时)
     *
     * @param rootPath 根路径
     * @param listener 文件发现监听器
     * @param timeout 超时（s）
     */
    default void scan(Path rootPath, FileScanListener listener, long timeout) {
        throw new UnsupportedOperationException("Please implement FileScanner, FileScannerListener.");
    }
    /**
     * 扫描指定路径下的文件（带进度反馈）(带超时)
     *  @param timeout 超时（s）
     */
    default void scanWithProgress(Path rootPath, ProgressAwareListener listener, long timeout) {
        throw new UnsupportedOperationException("Please implement FileScanner, ProgressAwareListener.");
    }

    /**
     * 取消扫描
     */
    void cancel();

    /**
     * 文件扫描监听器
     */
    interface FileScanListener {
        /**
         * On file found.
         *
         * @param file the file
         */
        void onFileFound(Path file);

        /**
         * On scan complete.
         */
        void onScanComplete();

        /**
         * On error.
         *
         * @param file the file
         * @param e    the e
         */
        void onError(Path file, Exception e);
    }


    interface ProgressAwareListener extends FileScanListener {
        /**
         * 进度更新回调
         * @param current 当前已处理文件数
         * @param total 预估总文件数（可能动态增长）
         */
        void onProgressUpdate(int current, int total);
    }
}
