/**
 * @fileoverview Run-related models
 * This module defines interfaces for DeepSource analysis runs.
 */

import { DeepSourceIssue } from './issues.js';
import { PaginationParams, PaginatedResponse } from '../utils/pagination/types.js';
import {
  AnalyzerShortcode,
  BranchName,
  CommitOid,
  GraphQLNodeId,
  RunId,
} from '../types/branded.js';

/**
 * Distribution of occurrences by analyzer type
 * @public
 */
export interface OccurrenceDistributionByAnalyzer {
  /** Shortcode of the analyzer */
  analyzerShortcode: AnalyzerShortcode;
  /** Number of issues introduced */
  introduced: number;
}

/**
 * Distribution of occurrences by category
 * @public
 */
export interface OccurrenceDistributionByCategory {
  /** Category of the issues */
  category: string;
  /** Number of issues introduced */
  introduced: number;
}

/**
 * Summary of an analysis run, including counts of issues
 * @public
 */
export interface RunSummary {
  /** Number of new issues introduced in this run */
  occurrencesIntroduced: number;
  /** Number of issues resolved in this run */
  occurrencesResolved: number;
  /** Number of issues suppressed in this run */
  occurrencesSuppressed: number;
  /** Distribution of issues by analyzer */
  occurrenceDistributionByAnalyzer?: OccurrenceDistributionByAnalyzer[];
  /** Distribution of issues by category */
  occurrenceDistributionByCategory?: OccurrenceDistributionByCategory[];
}

/**
 * Possible status values for an analysis run
 * Using a type instead of enum to avoid unused enum values linting errors
 * @public
 */
export type AnalysisRunStatus =
  | 'PENDING'
  | 'SUCCESS'
  | 'FAILURE'
  | 'TIMEOUT'
  | 'CANCEL'
  | 'READY'
  | 'SKIPPED';

/**
 * Represents a DeepSource analysis run
 * @public
 */
export interface DeepSourceRun {
  /** Internal ID of the run */
  id: GraphQLNodeId;
  /** Unique identifier for the run */
  runUid: RunId;
  /** Commit hash that this run analyzed */
  commitOid: CommitOid;
  /** Branch name for the run */
  branchName: BranchName;
  /** Base commit hash used for comparison */
  baseOid: CommitOid;
  /** Current status of the run */
  status: AnalysisRunStatus;
  /** Timestamp when the run was created */
  createdAt: string;
  /** Timestamp when the run was last updated */
  updatedAt: string;
  /** Timestamp when the run was finished (if completed) */
  finishedAt?: string;
  /** Summary of results from the run */
  summary: RunSummary;
  /** Repository information */
  repository: {
    /** Repository name */
    name: string;
    /** Repository ID */
    id: GraphQLNodeId;
  };
}

/**
 * Parameters for filtering runs
 * @public
 */
export interface RunFilterParams extends PaginationParams {
  /** Filter runs by analyzer shortcodes (e.g. ["python", "javascript"]) */
  analyzerIn?: AnalyzerShortcode[];
}

/**
 * Response containing a list of runs with pagination
 * @public
 */
export type RunsResponse = PaginatedResponse<DeepSourceRun>;

/**
 * Response structure for recent run issues
 * @public
 */
export interface RecentRunIssuesResponse extends PaginatedResponse<DeepSourceIssue> {
  /** The most recent run for the branch */
  run: DeepSourceRun;
}
