name: build-and-deploy

on:
  push:
    branches: [ main, master ]

jobs:
  build-and-deploy:
    runs-on: docker
    env:
      REG: ${{ vars.REGISTRY_URL }}
      REPO_OWNER: ${{ github.repository_owner }}
      APP_NAME: ${{ vars.APP_NAME }}
      APP_DOMAIN: ${{ vars.APP_DOMAIN }}
      NUXT_PUBLIC_APP_URL: ${{ vars.NUXT_PUBLIC_APP_URL }}
      # PostgreSQL
      POSTGRES_USER: ${{ vars.POSTGRES_USER || 'seguidor' }}
      POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD || 'seguidor_password' }}
      POSTGRES_DB: ${{ vars.POSTGRES_DB || 'seguidor_lotes' }}
      POSTGRES_PORT: ${{ vars.POSTGRES_PORT || '5432' }}
      NUXT_POSTGRES_URL: ${{ secrets.NUXT_POSTGRES_URL || vars.NUXT_POSTGRES_URL || '' }}
    steps:
      - uses: actions/checkout@v3

      - name: Build, push and deploy
        run: |
          # Login to registry
          docker login $REG -u ${{ secrets.REGISTRY_USERNAME }} -p ${{ secrets.REGISTRY_PASSWORD }}

          # Build and push
          echo "🔨 Building image..."
          cd nuxt4
          docker build -t $REG/$REPO_OWNER/$APP_NAME:${{ github.sha }} -t $REG/$REPO_OWNER/$APP_NAME:latest .
          echo "📤 Pushing images..."
          docker push $REG/$REPO_OWNER/$APP_NAME:${{ github.sha }}
          docker push $REG/$REPO_OWNER/$APP_NAME:latest

          # Deploy
          cd ..
          echo "ℹ️  Deploying $APP_NAME"
          echo "   Domain: $APP_DOMAIN"
          echo "   Image: $REG/$REPO_OWNER/$APP_NAME:latest"

          # Limpiar despliegue anterior si existe (nombre viejo)
          docker compose --project-name seguidor-de-lotes down -v 2>/dev/null || true

          docker compose pull
          docker compose --project-name $APP_NAME down

          # Levantar solo Postgres para sincronizar contraseña antes de la app
          docker compose --project-name $APP_NAME up -d postgres

          echo "⏳ Esperando a PostgreSQL..."
          for i in $(seq 1 30); do
            if docker exec -e PGPASSWORD="$POSTGRES_PASSWORD" $APP_NAME-postgres pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"; then
              break
            fi
            sleep 1
          done

          echo "🔐 Sincronizando contraseña de usuario $POSTGRES_USER..."
          ESCAPED_PASSWORD=${POSTGRES_PASSWORD//\'/\'\"\'\"\'}
          docker exec -e PGPASSWORD="$POSTGRES_PASSWORD" $APP_NAME-postgres psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "ALTER ROLE \"$POSTGRES_USER\" WITH PASSWORD '${ESCAPED_PASSWORD}';"
          docker exec -e PGPASSWORD="$POSTGRES_PASSWORD" $APP_NAME-postgres psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "SELECT pg_reload_conf();"

          # Ahora levantar app
          docker compose --project-name $APP_NAME up -d --remove-orphans --wait

          # Inicializar base de datos si es necesario
          echo "🗄️  Inicializando base de datos..."
          # Verificar si las tablas existen
          TABLE_EXISTS=$(docker exec -e PGPASSWORD="$POSTGRES_PASSWORD" $APP_NAME-postgres psql -U $POSTGRES_USER -d $POSTGRES_DB -tAc "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'lotes');")

          if [ "$TABLE_EXISTS" = "f" ]; then
            echo "📝 Ejecutando scripts de inicialización..."
            docker exec -e PGPASSWORD="$POSTGRES_PASSWORD" -i $APP_NAME-postgres psql -U $POSTGRES_USER -d $POSTGRES_DB < nuxt4/server/database/01_schema.sql
            docker exec -e PGPASSWORD="$POSTGRES_PASSWORD" -i $APP_NAME-postgres psql -U $POSTGRES_USER -d $POSTGRES_DB < nuxt4/server/database/02_seed.sql
            echo "✅ Base de datos inicializada"
          else
            echo "ℹ️  Base de datos ya inicializada"
          fi
