/**
 * @fileoverview ComplianceReport repository interface
 *
 * This module defines the repository interface for the ComplianceReport aggregate.
 */
import { IRepository } from '../../shared/repository.interface.js';
import { ComplianceReport } from './compliance-report.aggregate.js';
import { ProjectKey } from '../../../types/branded.js';
import { ReportType } from '../../../types/report-types.js';
import { ComplianceReportStatus, ComplianceReportId } from './compliance-report.types.js';
/**
 * Repository interface for ComplianceReport aggregates
 *
 * Provides methods for persisting and retrieving ComplianceReport aggregates.
 *
 * @example
 * ```typescript
 * class InMemoryComplianceReportRepository implements IComplianceReportRepository {
 *   private reports = new Map<string, ComplianceReport>();
 *
 *   async findById(id: string): Promise<ComplianceReport | null> {
 *     return this.reports.get(id) || null;
 *   }
 *
 *   async findByProjectAndType(
 *     projectKey: ProjectKey,
 *     reportType: ReportType
 *   ): Promise<ComplianceReport | null> {
 *     const id = `${projectKey}:${reportType}`;
 *     return this.reports.get(id) || null;
 *   }
 *
 *   async findLatest(projectKey: ProjectKey): Promise<ComplianceReport[]> {
 *     return Array.from(this.reports.values())
 *       .filter(r => r.projectKey === projectKey)
 *       .sort((a, b) => b.generatedAt.getTime() - a.generatedAt.getTime());
 *   }
 *
 *   async save(report: ComplianceReport): Promise<void> {
 *     this.reports.set(report.id, report);
 *   }
 * }
 * ```
 */
export interface IComplianceReportRepository extends IRepository<ComplianceReport, string> {
    /**
     * Finds a report by its composite ID
     *
     * @param _id - The composite ID (projectKey:reportType)
     * @returns The report if found, null otherwise
     */
    findById(_id: string): Promise<ComplianceReport | null>;
    /**
     * Finds a report by project and type
     *
     * @param _projectKey - The project key
     * @param _reportType - The report type
     * @returns The report if found, null otherwise
     */
    findByProjectAndType(_projectKey: ProjectKey, _reportType: ReportType): Promise<ComplianceReport | null>;
    /**
     * Finds the latest reports for a project
     *
     * @param _projectKey - The project key
     * @returns All reports for the project, sorted by generation date (newest first)
     */
    findLatest(_projectKey: ProjectKey): Promise<ComplianceReport[]>;
    /**
     * Finds reports by status
     *
     * @param _projectKey - The project key
     * @param _status - The report status
     * @returns Reports matching the status
     */
    findByStatus(_projectKey: ProjectKey, _status: ComplianceReportStatus): Promise<ComplianceReport[]>;
    /**
     * Finds all compliant reports for a project
     *
     * @param _projectKey - The project key
     * @returns Reports with compliance score >= 85%
     */
    findCompliantReports(_projectKey: ProjectKey): Promise<ComplianceReport[]>;
    /**
     * Finds reports with critical issues
     *
     * @param _projectKey - The project key
     * @returns Reports that have critical severity issues
     */
    findReportsWithCriticalIssues(_projectKey: ProjectKey): Promise<ComplianceReport[]>;
    /**
     * Finds a report by composite ID components
     *
     * @param _id - The composite ID components
     * @returns The report if found, null otherwise
     */
    findByCompositeId(_id: ComplianceReportId): Promise<ComplianceReport | null>;
    /**
     * Counts total reports for a project
     *
     * @param _projectKey - The project key
     * @returns The total number of reports
     */
    countByProject(_projectKey: ProjectKey): Promise<number>;
    /**
     * Counts reports by type for a project
     *
     * @param _projectKey - The project key
     * @param _reportType - The report type
     * @returns The number of reports of the given type
     */
    countByType(_projectKey: ProjectKey, _reportType: ReportType): Promise<number>;
    /**
     * Checks if a report exists for a project and type
     *
     * @param _projectKey - The project key
     * @param _reportType - The report type
     * @returns True if a report exists, false otherwise
     */
    exists(_projectKey: ProjectKey, _reportType: ReportType): Promise<boolean>;
}
