import { Nullable, ParserResultInterface, ClassifyReport, AnalysisReport } from '@pandacss/types';
import { ParserOptions } from '@pandacss/core';
import { Generator } from '@pandacss/generator';

interface RecipeReportEntry {
    recipeName: string;
    usedInXFiles: number;
    usedCount: number;
    variantCount: number;
    usedCombinations: number;
    percentUsed: number;
    jsxPercentUsed: number;
    fnPercentUsed: number;
    possibleCombinations: string[];
    unusedCombinations: number;
    mostUsedCombinations: string[];
}

interface TokenUsageItem {
    category: string;
    value: string;
    filePath: string;
    type: 'token' | 'nonToken';
    loc: Nullable<{
        line: number;
        column: number;
    }>;
}
interface TokenReportEntry {
    category: string;
    usedInXFiles: number;
    usedCount: number;
    count: number;
    percentUsed: number;
    hardcoded: number;
    mostUsedNames: string[];
}
interface TokenAnalysisReport {
    usageMap: Map<string, TokenUsageItem[]>;
    percentMap: Map<string, {
        total: number;
        used: number;
        unused: number;
        percent: number;
    }>;
    tokenNameMap: Map<string, string[]>;
    fileUsageMap: Map<string, Set<string>>;
    hardcodedTokenMap: Map<string, number>;
    totalMap: Map<string, number>;
    getSummary(): TokenReportEntry[];
}

type ReportFormat = 'json' | 'markdown' | 'csv' | 'text' | 'table';
declare function formatTokenReport(result: TokenReportEntry[], format: ReportFormat): string;
declare function formatRecipeReport(result: RecipeReportEntry[], format: ReportFormat): string;

declare class Reporter {
    #private;
    private ctx;
    private options;
    constructor(ctx: Generator, options: ReporterOptions);
    private setup;
    get report(): AnalysisReport;
    private parseFiles;
    private parseFile;
    init: () => void;
    getTokenReport: () => TokenAnalysisReport;
    getRecipeReport: () => RecipeReportEntry[];
}
interface ReporterOptions {
    onResult?: (file: string, result: ParserResultInterface) => void;
    project: {
        parserOptions: ParserOptions;
        parseSourceFile: (file: string) => ParserResultInterface | undefined;
        classify: (fileMap: Map<string, ParserResultInterface>) => ClassifyReport;
    };
    getFiles: () => string[];
    getRelativePath: (cwd: string, file: string) => string;
}

export { type RecipeReportEntry, type ReportFormat, Reporter, type ReporterOptions, type TokenAnalysisReport, type TokenReportEntry, formatRecipeReport, formatTokenReport };
