// AndroidAisMap: compileSdk/targetSdk 35, AGP 8.9, Gradle 8.11.1, Java 11 (toolchain on agent: JDK 21 OK).
// На сервере один раз (подставьте путь к sdkmanager):
//   yes | sdkmanager --licenses
//   sdkmanager --install "cmdline-tools;latest" "platforms;android-35" "build-tools;35.0.0" "platform-tools"
// NDK/CMake в проекте не заданы — отдельно не нужны, пока не добавите native-сборку.

pipeline {
    agent any

    environment {
        JAVA_HOME = '/usr/lib/jvm/java-21-openjdk-amd64'
        ANDROID_HOME = '/opt/android-sdk'
        ANDROID_SDK_ROOT = '/opt/android-sdk'
        PATH = "/usr/lib/jvm/java-21-openjdk-amd64/bin:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:${env.PATH}"

        TAIGA_PROJECT_ID = '3'
        TAIGA_URL = 'https://taiga.grigowashere.ru'
        GITEA_OWNER = 'Grigo'
        GITEA_REPO = 'AndroidAisMap'
        GITEA_URL = 'https://git.grigowashere.ru'
        GITEA_API_URL = "${GITEA_URL}/api/v1"
        GITEA_TOKEN_CREDENTIALS_ID = 'Gitea_Credentials' // ID ваших креденшлов для Gitea в Jenkins
    }

    stages {
        stage('Build Android APK') {
            steps {
                cleanWs()
                checkout scm

                sh '''
                    chmod +x ./gradlew
                    ./gradlew clean assembleDebug
                '''

                archiveArtifacts artifacts: '**/build/outputs/apk/**/*.apk', fingerprint: true
                stash name: 'apk', includes: '**/build/outputs/apk/**/*.apk'
            }
        }

        stage('Create Gitea Release and Upload APK') {
            steps {
                unstash 'apk'

                withCredentials([string(credentialsId: "${env.GITEA_TOKEN_CREDENTIALS_ID}", variable: 'GITEA_TOKEN')]) {
                    writeFile file: 'gitea-release.sh', text: '''
#!/bin/bash

apkPath="app/build/outputs/apk/debug/app-debug.apk"
headers="Authorization: token $GITEA_TOKEN"
commitish="${GIT_COMMIT:-$(git rev-parse HEAD)}"

# Создаем релиз на Gitea (target_commitish — текущий коммит сборки)
release=$(curl -X POST "${GITEA_API_URL}/repos/$GITEA_OWNER/$GITEA_REPO/releases" \
  -H "$headers" \
  -H "Content-Type: application/json" \
  -d '{
    "tag_name": "v'$BUILD_NUMBER'",
    "target_commitish": "'"$commitish"'",
    "name": "Release v'$BUILD_NUMBER'",
    "body": "Jenkins Android build '$BUILD_NUMBER'",
    "draft": false,
    "prerelease": false
  }')

releaseId=$(echo $release | jq -r .id)

# Формируем URL для загрузки APK
uploadUrl="${GITEA_API_URL}/repos/$GITEA_OWNER/$GITEA_REPO/releases/$releaseId/assets?name=app-debug.apk"

# Загружаем APK файл в Gitea
curl -X POST "$uploadUrl" \
  -H "$headers" \
  -F "attachment=@$apkPath;type=application/vnd.android.package-archive"

if [ $? -ne 0 ]; then
  echo "Gitea asset upload failed: $apkPath"
  exit 1
fi
'''

                    sh '''
                    chmod +x gitea-release.sh
                    ./gitea-release.sh
                    '''
                }
            }
        }
    }

    post {
        always {
            script {
                def result = currentBuild.currentResult ?: 'UNKNOWN'

                withCredentials([string(credentialsId: 'TAIGA_TOKEN', variable: 'TAIGA_TOKEN')]) {
                    sh(returnStatus: true, script: """
                        set +e

                        REF=\$(git log -1 --pretty=%B | grep -oE 'TG-[0-9]+' | head -1 | cut -d- -f2 || true)

                        if [ -z "\$REF" ]; then
                          echo "No TG-* reference found"
                          exit 0
                        fi

                        export REF
                        export BUILD_RESULT="${result}"

                        python3 - <<'PY'
import json
import os
import urllib.request

taiga_url = os.environ["TAIGA_URL"]
project_id = os.environ["TAIGA_PROJECT_ID"]
token = os.environ["TAIGA_TOKEN"]
ref = os.environ["REF"]

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json",
}

def get_json(path):
    url = f"{taiga_url}{path}"
    req = urllib.request.Request(url, headers=headers)
    try:
        with urllib.request.urlopen(req) as r:
            return json.loads(r.read().decode("utf-8"))
    except Exception:
        return None

targets = [
    ("userstories", "User Story"),
    ("issues", "Issue"),
    ("tasks", "Task"),
]

found = None

for endpoint, label in targets:
    data = get_json(f"/api/v1/{endpoint}/by_ref?project={project_id}&ref={ref}")
    if data and "id" in data:
        found = (endpoint, label, data)
        break

if not found:
    print(f"Taiga TG-{ref} not found")
    raise SystemExit(0)

endpoint, label, data = found

comment = (
    f"Jenkins Android build #{os.environ['BUILD_NUMBER']}: {os.environ['BUILD_RESULT']}\\n"
    f"{os.environ['BUILD_URL']}"
)

payload = json.dumps({
    "comment": comment,
    "version": data["version"],
}).encode("utf-8")

url = f"{taiga_url}/api/v1/{endpoint}/{data['id']}"
req = urllib.request.Request(
    url,
    data=payload,
    headers=headers,
    method="PATCH",
)

try:
    with urllib.request.urlopen(req) as r:
        print(f"Commented Taiga TG-{ref} ({label}), HTTP {r.status}")
except Exception as e:
    print(f"Taiga comment warning: {e}")
    raise SystemExit(0)
PY
                    """.stripIndent())
                }
            }
        }
    }
}