import * as core from '@actions/core'
import {getActionId} from './configuration'

const DEPRECATION_UPGRADE_PAGE = 'https://github.com/gradle/actions/blob/main/docs/deprecation-upgrade-guide.md'
const recordedDeprecations: Deprecation[] = []

export class Deprecation {
    constructor(readonly message: string) {}

    getDocumentationLink(): string {
        const deprecationAnchor = this.message
            .toLowerCase()
            .replace(/[^\w\s-]|_/g, '')
            .replace(/ /g, '-')
        return `${DEPRECATION_UPGRADE_PAGE}#${deprecationAnchor}`
    }
}

export function recordDeprecation(message: string): void {
    if (!recordedDeprecations.some(deprecation => deprecation.message === message)) {
        recordedDeprecations.push(new Deprecation(message))
    }
}

export function getDeprecations(): Deprecation[] {
    return recordedDeprecations
}

export function emitDeprecationWarnings(): void {
    if (recordedDeprecations.length > 0) {
        core.warning(
            `This job uses deprecated functionality from the '${getActionId()}' action. Consult the Job Summary for more details.`
        )
        for (const deprecation of recordedDeprecations) {
            core.info(`DEPRECATION: ${deprecation.message}. See ${deprecation.getDocumentationLink()}`)
        }
    }
}

export function saveDeprecationState(): void {
    core.saveState('deprecations', JSON.stringify(recordedDeprecations))
}

export function restoreDeprecationState(): void {
    const stringRep = core.getState('deprecations')
    if (stringRep === '') {
        return
    }

    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    JSON.parse(stringRep).forEach((obj: any) => {
        recordedDeprecations.push(new Deprecation(obj.message))
    })
}
