name: "Push to 'master' branch"

on:
  push:
    branches: 
    - "master"

jobs:
  build:
    name: Build and test
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v4
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: 8.0.x
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --no-restore
    - name: Test
      run: dotnet test --no-build --verbosity normal
  publish:
    name: Publish
    runs-on: ubuntu-latest
    needs: build
    strategy:
      matrix:
        app:
        - WatchIt.WebAPI
        - WatchIt.Website
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - name: Setup GitVersion
      uses: gittools/actions/gitversion/setup@v0.9.7
      with:
        versionSpec: 5.x
    - name: Determine Version
      uses: gittools/actions/gitversion/execute@v0.9.7
      id: gitversion
      with:
        useConfigFile: true
        configFilePath: .github/config/gitversion.yml
    - name: App Settings Variable Substitution for WatchIt.WebAPI
      uses: microsoft/variable-substitution@v1
      if: ${{ matrix.app == 'WatchIt.WebAPI' }}
      with:
        files: ${{ github.workspace }}/${{ matrix.app }}/${{ matrix.app }}/appsettings.json
      env:
        ConnectionStrings.Default: ${{ secrets.CONNECTION_STRING }}
        RootUser.Email: ${{ secrets.ROOT_EMAIL }}
        RootUser.Password: ${{ secrets.ROOT_PASSWORD }}
        Authentication.Key: ${{ secrets.KEY }}
    - name: App Settings Variable Substitution for WatchIt.Website
      uses: microsoft/variable-substitution@v1
      if: ${{ matrix.app == 'WatchIt.Website' }}
      with:
        files: ${{ github.workspace }}/${{ matrix.app }}/${{ matrix.app }}/appsettings.json
      env:
        Endpoints.Base: ${{ secrets.API_URL }}
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3
    - name: Login to GitHub Container Registry
      uses: docker/login-action@v1
      with:
        registry: ghcr.io
        username: ${{github.actor}}
        password: ${{secrets.GITHUB_TOKEN}}
    - name: Convert name to lowercase
      id: name
      uses: ASzc/change-string-case-action@v1
      with:
        string: ${{ matrix.app }}
    - name: Build image
      run: docker build ${{ github.workspace }} -t ghcr.io/${{github.actor}}/${{ steps.name.outputs.lowercase }}:latest -t ghcr.io/${{github.actor}}/${{ steps.name.outputs.lowercase }}:${{steps.gitversion.outputs.SemVer}} -f ${{ github.workspace }}/${{ matrix.app }}/${{ matrix.app }}/Dockerfile
    - name: Publish image
      run: docker push ghcr.io/${{github.actor}}/${{ steps.name.outputs.lowercase }} --all-tags
    outputs: 
      version: ${{ steps.gitversion.outputs.SemVer }}
  release:
    name: Release
    runs-on: ubuntu-latest
    needs: publish
    steps:
    - name: Create Release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{needs.publish.outputs.version}}
        release_name: ${{needs.publish.outputs.version}}
        draft: false
        prerelease: false
  deploy:
    name: Deploy
    runs-on: watchit
    needs: publish
    steps:
    - name: Login to GitHub Container Registry
      uses: docker/login-action@v1
      with:
        registry: ghcr.io
        username: ${{github.actor}}
        password: ${{secrets.GITHUB_TOKEN}}
    - name: Stop old WatchIt.WebAPI container
      continue-on-error: true
      run: docker container stop watchit.webapi
    - name: Remove old WatchIt.WebAPI container
      continue-on-error: true
      run: docker container rm watchit.webapi
    - name: Remove old WatchIt.WebAPI image
      continue-on-error: true
      run: docker image rm ghcr.io/mateuszskoczek/watchit.webapi
    - name: Stop old WatchIt.Website container
      continue-on-error: true
      run: docker container stop watchit.website
    - name: Remove old WatchIt.Website container
      continue-on-error: true
      run: docker container rm watchit.website
    - name: Remove old WatchIt.Website image
      continue-on-error: true
      run: docker image rm ghcr.io/mateuszskoczek/watchit.website
    - name: Pull new WatchIt.WebAPI image
      run: docker pull ghcr.io/mateuszskoczek/watchit.webapi:latest
    - name: Pull new WatchIt.Website image
      run: docker pull ghcr.io/mateuszskoczek/watchit.website:latest
    - name: Run new WatchIt.WebAPI container
      run: docker run -p 1080:8080 -d --name watchit.webapi ghcr.io/mateuszskoczek/watchit.webapi:latest
    - name: Run new WatchIt.Website container
      run: docker run -p 80:8080 -d --name watchit.website ghcr.io/mateuszskoczek/watchit.website:latest
    - name: Wait for initialization
      run: sleep 10
