/**
 * @fileoverview Project repository interface
 *
 * This module defines the repository interface for the Project aggregate.
 */
import { IRepository } from '../../shared/repository.interface.js';
import { Project } from './project.aggregate.js';
import { ProjectKey } from '../../../types/branded.js';
/**
 * Repository interface for Project aggregates
 *
 * Provides methods for persisting and retrieving Project aggregates.
 *
 * @example
 * ```typescript
 * class InMemoryProjectRepository implements IProjectRepository {
 *   private projects = new Map<ProjectKey, Project>();
 *
 *   async findByKey(key: ProjectKey): Promise<Project | null> {
 *     return this.projects.get(key) || null;
 *   }
 *
 *   async findAll(): Promise<Project[]> {
 *     return Array.from(this.projects.values());
 *   }
 *
 *   async save(project: Project): Promise<void> {
 *     this.projects.set(project.key, project);
 *   }
 *
 *   async delete(key: ProjectKey): Promise<void> {
 *     this.projects.delete(key);
 *   }
 * }
 * ```
 */
export interface IProjectRepository extends IRepository<Project, ProjectKey> {
    /**
     * Finds a project by its unique key
     *
     * @param key - The project key
     * @returns The project if found, null otherwise
     */
    findByKey(_key: ProjectKey): Promise<Project | null>;
    /**
     * Finds all projects
     *
     * @returns All projects in the repository
     */
    findAll(): Promise<Project[]>;
    /**
     * Finds all active projects
     *
     * @returns All projects with ACTIVE status
     */
    findActive(): Promise<Project[]>;
    /**
     * Finds projects by repository provider
     *
     * @param provider - The VCS provider (e.g., 'GITHUB', 'GITLAB')
     * @returns Projects using the specified provider
     */
    findByProvider(_provider: string): Promise<Project[]>;
    /**
     * Checks if a project exists with the given key
     *
     * @param key - The project key to check
     * @returns True if the project exists, false otherwise
     */
    exists(_key: ProjectKey): Promise<boolean>;
    /**
     * Counts the total number of projects
     *
     * @returns The total project count
     */
    count(): Promise<number>;
    /**
     * Counts the number of active projects
     *
     * @returns The active project count
     */
    countActive(): Promise<number>;
}
