name: "Release Manager [Dispatch]"

on:
  workflow_dispatch:
    inputs:
      ## Specify the type of the next release.
      #version_increment_type:
      #  type: choice
      #  description: 'VERSION INCREMENT TYPE'
      #  default: 'patch'
      #  required: false
      #  options:
      #    - 'major'
      #    - 'minor'
      #    - 'patch'
      merge:
        type: boolean
        description: 'MERGE RELEASE BRANCH TO MAIN'
        default: false
      start-rc:
        type: boolean
        description: 'Start Release Candidate'
        default: false

env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

permissions:
  contents: write
  issues: write
  pull-requests: write

jobs:
  get-pr:
    runs-on: ubuntu-latest
    outputs:
      pr_number: ${{ steps.get_pr.outputs.pr_number }}
    steps:
      - uses: actions/checkout@v4
      # headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
      - name: Get PRs
        run: |
          echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number  --jq '.[] | .number')" >> $GITHUB_OUTPUT
        id: get_pr
        env:
          STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}

  merge:
    uses: misskey-dev/release-manager-actions/.github/workflows/merge.yml@v2
    needs: get-pr
    if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge == true }}
    with:
      pr_number: ${{ needs.get-pr.outputs.pr_number }}
      user: 'github-actions[bot]'
      package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
      # Text to prepend to the changelog
      # The first line must be `## Unreleased`
      changes_template: |
        ## Unreleased

        ### General
        -

        ### Client
        -

        ### Server
        -

      use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
      indent: ${{ vars.INDENT }}
    secrets:
      RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
      RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

  create-prerelease:
    uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v2
    needs: get-pr
    if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge != true  }}
    with:
      pr_number: ${{ needs.get-pr.outputs.pr_number }}
      user: 'github-actions[bot]'
      package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
      use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
      indent: ${{ vars.INDENT }}
      draft_prerelease_channel: alpha
      ready_start_prerelease_channel: beta
      prerelease_channel: ${{ inputs.start-rc && 'rc' || '' }}
      reset_number_on_channel_change: true
    secrets:
      RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
      RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

  create-target:
    uses: misskey-dev/release-manager-actions/.github/workflows/create-target.yml@v2
    needs: get-pr
    if: ${{ needs.get-pr.outputs.pr_number == '' }}
    with:
      user: 'github-actions[bot]'
      # The script for version increment.
      # process.env.CURRENT_VERSION: The current version.
      #
      # Misskey calender versioning (yyyy.MM.patch) example
      version_increment_script: |
        const now = new Date();
        const year = now.toLocaleDateString('en-US', { year: 'numeric', timeZone: 'Asia/Tokyo' });
        const month = now.toLocaleDateString('en-US', { month: 'numeric', timeZone: 'Asia/Tokyo' });
        const [major, minor, _patch] = process.env.CURRENT_VERSION.split('.');
        const patch = Number(_patch.split('-')[0]);
        if (Number.isNaN(patch)) {
          console.error('Invalid patch version', year, month, process.env.CURRENT_VERSION, major, minor, _patch);
          throw new Error('Invalid patch version');
        }
        if (year !== major || month !== minor) {
          return `${year}.${month}.0`;
        } else {
          return `${major}.${minor}.${patch + 1}`;
        }
      ##Semver example
      #version_increment_script: |
      #  const [major, minor, patch] = process.env.CURRENT_VERSION.split('.');
      #  if ("${{ inputs.version_increment_type }}" === "major") {
      #    return `${Number(major) + 1}.0.0`;
      #  } else if ("${{ inputs.version_increment_type }}" === "minor") {
      #    return `${major}.${Number(minor) + 1}.0`;
      #  } else {
      #    return `${major}.${minor}.${Number(patch) + 1}`;
      #  }
      package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
      use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
      indent: ${{ vars.INDENT }}
      stable_branch: ${{ vars.STABLE_BRANCH }}
      draft_prerelease_channel: alpha
    secrets:
      RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
      RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
