import { EventBridgeEvent, EventBridgeHandler } from './eventbridge';

export type CodeBuildCloudWatchStateHandler = EventBridgeHandler<'CodeBuild Build State Change', CodeBuildStateEventDetail, void>;

export type CodeBuildStateType = 'IN_PROGRESS' | 'SUCCEEDED' | 'FAILED' | 'STOPPED';
export type CodeBuildPhaseType =
    | 'COMPLETED'
    | 'FINALIZING'
    | 'UPLOAD_ARTIFACTS'
    | 'POST_BUILD'
    | 'BUILD'
    | 'PRE_BUILD'
    | 'INSTALL'
    | 'QUEUED'
    | 'DOWNLOAD_SOURCE'
    | 'PROVISIONING'
    | 'SUBMITTED';
export type CodeBuildPhaseStatusType =
    | 'TIMED_OUT'
    | 'STOPPED'
    | 'FAILED'
    | 'SUCCEEDED'
    | 'FAULT'
    | 'CLIENT_ERROR';
export type CodeBuildCacheType = 'NO_CACHE' | 'LOCAL' | 'S3';
export type CodeBuildSourceLocationType =
    | 'CODECOMMIT'
    | 'CODEPIPELINE'
    | 'GITHUB'
    | 'GITHUB_ENTERPRISE'
    | 'BITBUCKET'
    | 'S3'
    | 'NO_SOURCE';
export type CodeBuildEnvironmentType =
    | 'LINUX_CONTAINER'
    | 'LINUX_GPU_CONTAINER'
    | 'WINDOWS_CONTAINER'
    | 'ARM_CONTAINER';
export type CodeBuildEnvironmentPullCredentialsType = 'CODEBUILD' | 'SERVICE_ROLE';
export type CodeBuildEnvironmentComputeType =
    | 'BUILD_GENERAL1_SMALL'
    | 'BUILD_GENERAL1_MEDIUM'
    | 'BUILD_GENERAL1_LARGE'
    | 'BUILD_GENERAL1_2XLARGE';
export type CodeBuildEnvironmentVariableType = 'PARAMETER_STORE' | 'PLAINTEXT' | 'SECRETS_MANAGER';

export interface CodeBuildStateEventDetail {
    'build-status': CodeBuildStateType;
    'project-name': string;
    'build-id': string;
    'current-phase': CodeBuildPhaseType;
    'current-phase-context': string;
    version: string;
    'additional-information': {
        cache: {
            type: CodeBuildCacheType;
        };
        'build-number': number;
        'timeout-in-minutes': number;
        'build-complete': boolean;
        initiator: string;
        'build-start-time': string;
        source: {
            buildspec: string;
            location: string;
            type: CodeBuildSourceLocationType;
        };
        'source-version': string;
        artifact: {
            location: string;
        };
        environment: {
            image: string;
            'privileged-mode': boolean;
            'image-pull-credentials-type'?: CodeBuildEnvironmentPullCredentialsType | undefined;
            'compute-type': CodeBuildEnvironmentComputeType;
            type: CodeBuildEnvironmentType;
            'environment-variables': Array<{
                name: string;
                type?: CodeBuildEnvironmentVariableType | undefined;
                value: string;
            }>;
        };
        'project-file-system-locations': [];
        logs: {
            'group-name': string;
            'stream-name': string;
            'deep-link': string;
        };
        phases: Array<{
            'phase-context'?: string[] | undefined; // Not available for COMPLETED phase-type
            'start-time': string;
            'end-time'?: string | undefined; // Not available for COMPLETED phase-type
            'duration-in-seconds'?: number | undefined; // Not available for COMPLETED phase-type
            'phase-type': CodeBuildPhaseType;
            'phase-status'?: CodeBuildPhaseStatusType | undefined; // Not available for COMPLETED phase-type
        }>;
        'queued-timeout-in-minutes': number;
    };
}

export interface CodeBuildCloudWatchStateEvent extends EventBridgeEvent<'CodeBuild Build State Change', CodeBuildStateEventDetail> {
    source: 'aws.codebuild';
}
