name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  CARGO_TERM_COLOR: always

jobs:
  self-care:
    name: Flake self-check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Check Nix flake inputs
        uses: DeterminateSystems/flake-checker-action@v7
        with:
          fail-mode: true

  pre-commit-checks:
    name: "Cargo fmt, typos"
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Cargo fmt
        run: |
          nix develop -i -L .#nightly --command bash -c '
            # Force use of Nix-provided rustfmt
            export RUSTFMT=$(command -v rustfmt)
            cargo fmt --check
          '
      - name: typos
        run: nix develop -i -L .#nightly --command typos    

  clippy:
    name: "Stable build, clippy and test"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-args:
          [
            -p cdk,
            -p cdk --no-default-features,
            -p cdk --no-default-features --features wallet,
            -p cdk --no-default-features --features mint,
            -p cdk --no-default-features --features "mint swagger",
            -p cdk-redb,
            -p cdk-sqlite,
            -p cdk-axum --no-default-features,
            -p cdk-axum --no-default-features --features swagger,
            -p cdk-axum --no-default-features --features redis,
            -p cdk-axum --no-default-features --features "redis swagger",
            -p cdk-axum,
            -p cdk-cln,
            -p cdk-lnd,
            -p cdk-phoenixd,
            -p cdk-strike,
            -p cdk-lnbits,
            -p cdk-fake-wallet,
            --bin cdk-cli,
            --bin cdk-mintd,
            --bin cdk-mintd --no-default-features --features swagger,
            --bin cdk-mintd --no-default-features --features redis,
            --bin cdk-mintd --no-default-features --features "redis swagger",
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Build
        run: nix develop -i -L .#stable --command cargo build ${{ matrix.build-args }}
      - name: Clippy
        run: nix develop -i -L .#stable --command cargo clippy ${{ matrix.build-args }} -- -D warnings
      - name: Test
        run: nix develop -i -L .#stable --command cargo test ${{ matrix.build-args }}

  itest:
    name: "Integration regtest tests"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-args:
          [
            -p cdk-integration-tests,
          ]
        database: 
          [
            REDB,
            SQLITE,
            MEMORY,
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Clippy
        run: nix develop -i -L .#stable --command cargo clippy ${{ matrix.build-args }} -- -D warnings
      - name: Test
        run: nix develop -i -L .#stable --command just itest ${{ matrix.database }}
          
  fake-wallet-itest:
    name: "Integration fake wallet tests"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-args:
          [
            -p cdk-integration-tests,
          ]
        database: 
          [
          REDB,
          SQLITE,
          MEMORY,
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Clippy
        run: nix develop -i -L .#stable --command cargo clippy ${{ matrix.build-args }} -- -D warnings
      - name: Test fake mint
        run: nix develop -i -L .#stable --command just fake-mint-itest ${{ matrix.database }}

  msrv-build:
    name: "MSRV build"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-args:
          [
            -p cdk,
            -p cdk --no-default-features,
            -p cdk --no-default-features --features wallet,
            -p cdk --no-default-features --features mint,
            -p cdk-axum,
            -p cdk-axum --no-default-features --features redis,
            -p cdk-strike,
            -p cdk-lnbits,
            -p cdk-phoenixd,
            -p cdk-fake-wallet,
            -p cdk-cln,
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Build
        run: nix develop -i -L .#msrv --command cargo build ${{ matrix.build-args }}

  
  db-msrv-build:
    name: "DB MSRV build"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-args:
          [
            -p cdk-sqlite,
            -p cdk-redb,
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Build
        run: nix develop -i -L .#db_shell --command cargo build ${{ matrix.build-args }}

  check-wasm:
    name: Check WASM
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - stable
        target:
          - wasm32-unknown-unknown
        build-args:
          [
            -p cdk,
            -p cdk --no-default-features,
            -p cdk --no-default-features --features wallet,
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Build cdk and binding
        run: nix develop -i -L ".#${{ matrix.rust }}" --command cargo build ${{ matrix.build-args }} --target ${{ matrix.target }}

        
  check-wasm-msrv:
    name: Check WASM
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - msrv
        target:
          - wasm32-unknown-unknown
        build-args:
          [
            -p cdk,
            -p cdk --no-default-features,
            -p cdk --no-default-features --features wallet,
          ]
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@v11
      - name: Nix Cache
        uses: DeterminateSystems/magic-nix-cache-action@v6
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Build cdk wasm
        run: nix develop -i -L ".#${{ matrix.rust }}" --command cargo build ${{ matrix.build-args }} --target ${{ matrix.target }}