# kind: pipeline
# type: docker
# name: server_build_and_test
#
# trigger:
#   branch:
#     - main
#   event:
#     - push
#
# steps:
#   - name: build_server
#     image: node
#     commands:
#       - npm ci -w @calchat/shared
#       - npm ci -w @calchat/server
#       - npm run build -w @calchat/server
#
#   - name: jest_server
#     image: node
#     commands:
#       - npm run test -w @calchat/server
#
# ---
#
# kind: pipeline
# type: docker
# name: check_for_formatting
#
# trigger:
#   branch:
#     - main
#   event:
#     - push
#
# steps:
#   - name: format_check
#     image: node
#     commands:
#       - npm ci
#       - npm run check_format
#
# ---

kind: pipeline
type: docker
name: deploy_latest

trigger:
  branch:
    - main
  event:
    - push

steps:
  # - name: upload_latest
  #   image: plugins/docker
  #   settings:
  #     registry: gitea.gilmour109.de
  #     repo: gitea.gilmour109.de/gilmour109/calchat-server
  #     dockerfile: apps/server/docker/Dockerfile
  #     tags:
  #       - latest
  #       - ${DRONE_COMMIT_SHA:0:8}
  #     username:
  #       from_secret: gitea_username
  #     password:
  #       from_secret: gitea_password
  #
  # - name: deploy_to_vps
  #   image: appleboy/drone-ssh
  #   settings:
  #     host:
  #       - 10.0.0.1
  #     username: root
  #     password:
  #       from_secret: vps_ssh_password
  #     envs:
  #       - gitea_username
  #       - gitea_password
  #     port: 22
  #     command_timeout: 10m
  #     script:
  #       - docker login -u $GITEA_USERNAME -p $GITEA_PASSWORD gitea.gilmour109.de
  #       - docker pull gitea.gilmour109.de/gilmour109/calchat-server:latest
  #       - docker compose -f /root/calchat-mongo/docker-compose.yml up -d

  - name: deploy_test_backend
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      K3S_SSH_PASSWORD:
        from_secret: k3s_ssh_password
    commands:
      - export NAME=e2e$(echo $DRONE_COMMIT_SHA | head -c 8)
      - export TAG=$(echo $DRONE_COMMIT_SHA | head -c 8)
      - export COMMIT=$DRONE_COMMIT_SHA
      - envsubst < kubernetes/manifest.yml > /tmp/e2e-manifest.yml
      - sshpass -p "$K3S_SSH_PASSWORD" scp /tmp/e2e-manifest.yml debian@192.168.178.201:/tmp/e2e-manifest.yml
      - sshpass -p "$K3S_SSH_PASSWORD" ssh debian@192.168.178.201 "sudo kubectl apply -f /tmp/e2e-manifest.yml"
      - sshpass -p "$K3S_SSH_PASSWORD" ssh debian@192.168.178.201 "sudo kubectl wait --for=condition=available --timeout=120s deployment/calchat-server-$NAME"

  - name: create_e2e_vm
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
      TF_VAR_proxmox_password:
        from_secret: proxmox_password
      TF_VAR_clone_vm_password:
        from_secret: e2e_vm_password
      AWS_ACCESS_KEY_ID:
        from_secret: tofu_garage_access_key
      AWS_SECRET_ACCESS_KEY:
        from_secret: tofu_garage_secret_key
    commands:
      - cd tofu/e2e
      - tofu init
      - tofu apply -auto-approve

  - name: run_e2e_tests
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      E2E_VM_PASSWORD:
        from_secret: e2e_vm_password
    commands:
      - export VM_IP=192.168.178.$((211 + DRONE_BUILD_NUMBER % 44))
      - export RUN_ID=$(echo $DRONE_COMMIT_SHA | head -c 8)
      - export API_URL="http://e2e$${RUN_ID}.192.168.178.201.nip.io"
      - echo "VM_IP=$VM_IP RUN_ID=$RUN_ID API_URL=$API_URL"
      - echo "Waiting for VM to be reachable..."
      - timeout 60 bash -c "until sshpass -p \"$E2E_VM_PASSWORD\" ssh debian@$VM_IP 'echo ok'; do sleep 5; done"
      - sshpass -p "$E2E_VM_PASSWORD" scp scripts/e2e-test.sh debian@$VM_IP:/tmp/e2e-test.sh
      - sshpass -p "$E2E_VM_PASSWORD" ssh debian@$VM_IP "chmod +x /tmp/e2e-test.sh"
      - sshpass -p "$E2E_VM_PASSWORD" ssh debian@$VM_IP "REPO_URL=https://gitea.gilmour109.de/gilmour109/calchat.git COMMIT_SHA=$DRONE_COMMIT_SHA API_URL=$API_URL bash /tmp/e2e-test.sh"
      - sshpass -p "$E2E_VM_PASSWORD" scp debian@$VM_IP:/tmp/e2e-results.txt /tmp/e2e-results.txt

  - name: destroy_e2e_vm
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
      TF_VAR_proxmox_password:
        from_secret: proxmox_password
      TF_VAR_clone_vm_password:
        from_secret: e2e_vm_password
      AWS_ACCESS_KEY_ID:
        from_secret: tofu_garage_access_key
      AWS_SECRET_ACCESS_KEY:
        from_secret: tofu_garage_secret_key
    commands:
      - cd tofu/e2e
      - tofu init
      - tofu destroy -auto-approve
    when:
      status:
        - success
        - failure

  - name: cleanup_k3s
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      K3S_SSH_PASSWORD:
        from_secret: k3s_ssh_password
    commands:
      - export NAME=e2e$(echo $DRONE_COMMIT_SHA | head -c 8)
      - sshpass -p "$K3S_SSH_PASSWORD" ssh debian@192.168.178.201 "sudo kubectl delete all,ingress -l deploy-name=$NAME --ignore-not-found"
    when:
      status:
        - success
        - failure

  # - name: build_apk
  #   image: gitea.gilmour109.de/gilmour109/eas-build:latest
  #   environment:
  #     EXPO_TOKEN:
  #       from_secret: expo_token
  #   commands:
  #     - npm ci
  #     - npm run build -w @calchat/shared
  #     - npm run -w @calchat/client build:apk
  #   when:
  #     status:
  #       - success
  #
  # - name: upload_apk
  #   image: plugins/s3
  #   settings:
  #     endpoint: https://garage.gilmour109.de
  #     bucket: calchat-releases
  #     access_key:
  #       from_secret: calchat_drone_garage_access_key
  #     secret_key:
  #       from_secret: calchat_drone_garage_secret_key
  #     source: apps/client/calchat.apk
  #     target: /
  #     region: garage
  #     path_style: true
  #   when:
  #     status:
  #       - success

# depends_on:
#   - server_build_and_test
#   - check_for_formatting

# ---
#
# kind: pipeline
# type: docker
# name: upload_tag
#
# trigger:
#   event:
#     - tag
#
# steps:
#   - name: upload_tag
#     image: plugins/docker
#     settings:
#       registry: gitea.gilmour109.de
#       repo: gitea.gilmour109.de/gilmour109/calchat-server
#       dockerfile: apps/server/docker/Dockerfile
#       tags:
#         - ${DRONE_TAG}
#       username:
#         from_secret: gitea_username
#       password:
#         from_secret: gitea_password
#
#   - name: deploy_to_k3s
#     image: appleboy/drone-ssh
#     settings:
#       host:
#         - 192.168.178.201
#       username: debian
#       password:
#         from_secret: k3s_ssh_password
#       envs:
#         - drone_tag
#         - drone_commit_sha
#       port: 22
#       command_timeout: 10m
#       script:
#         - export TAG=$DRONE_TAG
#         - export NAME=$(echo $DRONE_TAG | tr -d '.')
#         - export COMMIT=$DRONE_COMMIT_SHA
#         - envsubst < /home/debian/manifest.yml | sudo kubectl apply -f -
#
#   - name: create_e2e_vm
#     image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
#     environment:
#       TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
#       TF_VAR_proxmox_password:
#         from_secret: proxmox_password
#       TF_VAR_clone_vm_password:
#         from_secret: e2e_vm_password
#       TOFU_GARAGE_ACCESS_KEY:
#         from_secret: tofu_garage_access_key
#       TOFU_GARAGE_SECRET_KEY:
#         from_secret: tofu_garage_secret_key
#     commands:
#       - cd tofu/e2e
#       - tofu init
#       - tofu apply -auto-approve
#
#   - name: run_e2e_tests
#     image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
#     environment:
#       E2E_VM_PASSWORD:
#         from_secret: e2e_vm_password
#     commands:
#       - export VM_IP=192.168.178.$((211 + DRONE_BUILD_NUMBER % 44))
#       - export TAG_NAME=$(echo $DRONE_TAG | tr -d '.')
#       - export API_URL="http://$${TAG_NAME}.192.168.178.201.nip.io"
#       - timeout 120 bash -c "until sshpass -p '$E2E_VM_PASSWORD' ssh debian@$VM_IP 'echo ok' 2>/dev/null; do sleep 5; done"
#       - sshpass -p "$E2E_VM_PASSWORD" scp scripts/e2e-test.sh debian@$VM_IP:/tmp/e2e-test.sh
#       - sshpass -p "$E2E_VM_PASSWORD" ssh debian@$VM_IP "chmod +x /tmp/e2e-test.sh"
#       - sshpass -p "$E2E_VM_PASSWORD" ssh debian@$VM_IP "REPO_URL=https://gitea.gilmour109.de/gilmour109/calchat.git COMMIT_SHA=$DRONE_COMMIT_SHA API_URL=$API_URL bash /tmp/e2e-test.sh"
#       - sshpass -p "$E2E_VM_PASSWORD" scp debian@$VM_IP:/tmp/e2e-results.txt /tmp/e2e-results.txt
#
#   - name: notify_failure
#     image: drillster/drone-email
#     settings:
#       host:
#         from_secret: smtp_host
#       username:
#         from_secret: smtp_username
#       password:
#         from_secret: smtp_password
#       from: drone@gilmour109.de
#       recipients:
#         - liwa7755@bht-berlin.de
#       subject: "E2E Tests failed: ${DRONE_REPO} ${DRONE_TAG} #${DRONE_BUILD_NUMBER}"
#       body: |
#         E2E tests failed for tag ${DRONE_TAG} (commit ${DRONE_COMMIT_SHA:0:8}).
#         Build: ${DRONE_BUILD_LINK}
#     when:
#       status:
#         - failure
#
#   - name: destroy_e2e_vm
#     image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
#     environment:
#       TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
#       TF_VAR_proxmox_password:
#         from_secret: proxmox_password
#       TF_VAR_clone_vm_password:
#         from_secret: e2e_vm_password
#       TOFU_GARAGE_ACCESS_KEY:
#         from_secret: tofu_garage_access_key
#       TOFU_GARAGE_SECRET_KEY:
#         from_secret: tofu_garage_secret_key
#     commands:
#       - cd tofu/e2e
#       - tofu init
#       - tofu destroy -auto-approve
#     when:
#       status:
#         - success
#         - failure
#
#   - name: build_apk
#     image: gitea.gilmour109.de/gilmour109/eas-build:latest
#     environment:
#       EXPO_TOKEN:
#         from_secret: expo_token
#     commands:
#       - npm ci
#       - npm run build -w @calchat/shared
#       - npm run -w @calchat/client build:apk
#     when:
#       status:
#         - success
#
#   - name: release_apk
#     image: plugins/gitea-release
#     settings:
#       api_key:
#         from_secret: gitea_token
#       base_url: https://gitea.gilmour109.de
#       files:
#         - calchat.apk
#       title: ${DRONE_TAG}
#     when:
#       status:
#         - success
