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

image: node:lts

stages:
    - test
    - build
    - prepare-release
    - release
    - publish

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
        - if [[ ! -z ${CI_COMMIT_TAG+x} ]]; then export NODE_ENV=production; fi
    script:
        - yarn build
        - mv dist ds4
    cache:
        <<: *global_cache
    artifacts:
        paths:
            - ds4
        expire_in: 1 week

publish-artifacts:
    stage: prepare-release
    image: alpine:latest
    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"
    rules:
        - if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'

changelog:
    stage: prepare-release
    before_script:
        - yarn install --immutable
    script:
        - yarn changelog
    cache:
        <<: *global_cache
    artifacts:
        paths:
            - CHANGELOG.md
    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 "chore(release): ${RELEASE_VERSION}"
        git tag -f ${RELEASE_VERSION}
        git push origin ci-processing:${CI_BUILD_REF_NAME} -o ci.skip
        git push origin ${RELEASE_VERSION}
    only:
        - master
    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

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.md"
        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

publish-latest-manifest:
    stage: publish
    image: alpine:latest
    before_script:
        - apk update
        - apk add zip curl
    script: |
        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]+$/'

publish-to-foundry-admin:
    stage: publish
    image: johannesloher/foundry-publish
    variables:
        FVTT_MANIFEST_PATH: ds4/system.json
        FVTT_MANIFEST_URL: ${CI_PROJECT_URL}/-/releases/${CI_COMMIT_TAG}/downloads/system.json
    script: foundry-publish
    rules:
        - if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'