# SPDX-FileCopyrightText: 2021 Johannes Loher
# SPDX-FileCopyrightText: 2021 Oliver Rümpelein
#
# SPDX-License-Identifier: MIT

image: node:lts

stages:
    - test
    - build
    - publish
    - release

cache: &global_cache
    paths:
        - .yarn/cache

lint:
    stage: test
    before_script:
        - yarn install --immutable
    script:
        - yarn lint
    cache:
        <<: *global_cache

test:
    stage: test
    before_script:
        - yarn install --immutable
    script:
        - yarn test:ci
    cache:
        <<: *global_cache
    artifacts:
        when: always
        reports:
            junit:
                - junit.xml

reuse:
    stage: test
    image:
        name: fsfe/reuse:latest
        entrypoint: [""]
    script:
        - reuse lint

build:
    stage: build
    before_script:
        - yarn install --immutable
    script:
        - yarn build
        - mv dist ds4
    cache:
        <<: *global_cache
    artifacts:
        paths:
            - ds4
        expire_in: 1 week

publish-artifacts:
    image: alpine:latest
    stage: publish
    before_script:
        - apk update
        - apk add zip curl
    script: |
        zip -r ds4.zip ds4/*
        curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ds4.zip "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/ds4.zip"
        curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ds4/system.json "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/system.json"
        curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ds4/system.json "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/latest/system.json"
    rules:
        - if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'

.release-template: &release-template
    stage: release
    before_script:
        - yarn install
        - apt update
        - apt install --yes jq
        - REPOSITORY_URL=$(echo "${CI_REPOSITORY_URL}" | sed -e "s|gitlab-ci-token:.*@|${RELEASE_TOKEN}:${RELEASE_TOKEN_SECRET}@|g")
        - git remote set-url origin $REPOSITORY_URL
        - git config user.name $GITLAB_USER_LOGIN
        - git config user.email $GITLAB_USER_EMAIL
        - git branch -D ci-processing || true
        - git checkout -b ci-processing
    cache:
        <<: *global_cache
    script: |
        yarn bump-version --release=${RELEASE_TYPE}
        RELEASE_VERSION=$(jq -r '.version' < package.json)
        git add package.json src/system.json
        git --no-pager diff
        git commit -m "release version ${RELEASE_VERSION}"
        git tag -f ${RELEASE_VERSION}
        git push origin ci-processing:${CI_BUILD_REF_NAME} -o ci.skip
        git push origin ${RELEASE_VERSION}
    rules:
        - if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
          when: manual

release-patch:
    variables:
        RELEASE_TYPE: patch
    <<: *release-template

release-minor:
    variables:
        RELEASE_TYPE: minor
    <<: *release-template

release-major:
    variables:
        RELEASE_TYPE: major
    <<: *release-template

bump-latest-tag:
    stage: release
    image: alpine:latest
    before_script:
        - apk update
        - apk add git
        - REPOSITORY_URL=$(echo "${CI_REPOSITORY_URL}" | sed -e "s|gitlab-ci-token:.*@|${RELEASE_TOKEN}:${RELEASE_TOKEN_SECRET}@|g")
        - git remote set-url origin $REPOSITORY_URL
        - git config user.name $GITLAB_USER_LOGIN
        - git config user.email $GITLAB_USER_EMAIL
    script: |
        git tag -f latest -m "This tag is only being kept for backwards compatibility. To install the DS4 system, please use the following manifest URL instead: https://git.f3l.de/api/v4/projects/dungeonslayers%2Fds4/packages/generic/ds4/latest/system.json"
        git push origin latest -f -o ci.skip
    rules:
        - if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'

release:
    stage: release
    image: registry.gitlab.com/gitlab-org/release-cli:latest
    script:
        - echo 'release job'
    rules:
        - if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'
    release:
        tag_name: $CI_COMMIT_TAG
        description: "# Changelog"
        assets:
            links:
                - name: "ds4.zip"
                  url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/ds4.zip"
                  filepath: /ds4.zip
                  link_type: package
                - name: "system.json"
                  url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/system.json"
                  filepath: /system.json
                  link_type: other