import { SharedContracts } from './shared-contracts';

export namespace EnvironmentContracts {
    export interface IEnvironmentCloningStateResponseContract {
        cloning_state: 'in_progress' | 'failed' | 'done';
    }

    export interface IDeleteEnvironmentResponseContract {}

    export interface IEnvironmentResponseContract {
        id: string;
        name: string;
        is_production: boolean;
    }

    export interface IModifyEnvironmentResponseContract extends IEnvironmentResponseContract {}

    export interface ICloneEnvironmentResponseContract {
        id: string;
        management_api_key: string;
        delivery_preview_api_key: string;
        secured_delivery_api_key: string;
    }

    export interface IMarkEnvironmentAsProductionResponseContract {}

    export interface IEnvironmentInformationResponseContract {
        id: string;
        name: string;
        environment: string;
    }

    export type EnvironmentValidationIssueType = 'type_issue' | 'variant_issue';

    export interface IEnvironmentValidationItemIssueContract {
        element: IEnvironmentVariantElementContract;
        messages: string[];
    }

    export interface IEnvironmentValidationIssueContract {
        issue_type: EnvironmentValidationIssueType;
        item?: IEnvironmentVariantContentItemContract;
        type?: IEnvironmentTypeContract;
        language?: IEnvironmentVariantLanguageContract;
        issues: IEnvironmentValidationItemIssueContract[];
    }

    export interface IEnvironmentValidationListResponseContract {
        issues: IEnvironmentValidationIssueContract[];
        pagination: SharedContracts.IPaginationModelContract;
    }

    export type EnvironmentValidationStatus = 'finished' | 'queued' | 'failed';
    export type EnvironmentValidationResult = 'none' | 'no_issues' | 'issues_found';

    export interface IStartEnvironmentValidationResponseContract {
        id: string;
        status: EnvironmentValidationStatus;
        validation_result: EnvironmentValidationResult;
    }

    export interface ICheckEnvironmentValidationResponseContract {
        id: string;
        status: EnvironmentValidationStatus;
        validation_result: EnvironmentValidationResult;
    }

    export interface IEnvironmentReportModelContract {
        id: string;
        name: string;
    }

    export interface IEnvironmentVariantContentItemContract {
        id: string;
        name: string;
        codename: string;
    }

    export interface IEnvironmentVariantLanguageContract {
        id: string;
        name: string;
        codename: string;
    }

    export interface IEnvironmentVariantElementContract {
        id: string;
        name: string;
        codename: string;
    }

    export interface IEnvironmentTypeContract {
        id: string;
        name: string;
        codename: string;
    }

    export interface IEnvironmentTypeIssueContract {
        type: IEnvironmentTypeContract;
        issues: IEnvironmentIssueContract[];
    }

    export interface IEnvironmentIssueContract {
        element: IEnvironmentVariantElementContract;
        messages: string[];
    }

    export interface IEnvironmentVariantIssueContract {
        item: IEnvironmentVariantContentItemContract;
        language: IEnvironmentVariantLanguageContract;
        issues: IEnvironmentIssueContract[];
    }
}
