name: Build
on:
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:
    inputs:
      platform:
        description: Platform
        required: false

env:
  TAG_NAME: latest

jobs:
  buildroot:
    name: Firmware
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        platform:
          - gk7202v300_lite_cootli_camv0103
          - gk7202v300_lite_xg521
          - gk7205v200_lite_tiandy-tc-c321n
          - gk7205v200_lite_vixand-ipc-1
          - gk7205v200_lite_vixand-iph-5-4g
          - gk7205v210_lite_tiandy-tc-c32qn
          - gk7205v210_lite_vixand-ivg-g3s
          - gk7205v210_lite_vixand-ivg-g4f-a
          - gk7205v210_lite_vixand-ivg-g4f-a-w
          - gk7205v210_lite_vixand-ivg-g4h
          - gk7205v300_lite_vixand-ivg-g6s-w
          - hi3516cv200_lite_trassir-tr-d4121ir1-v2
          - hi3516ev300_ultimate_rostelecom-ipc8232swc-we
          - hi3516ev300_ultimate_rvi-1ncmw2028
          - hi3518ev200_lite_smartwares-cip-37210
          - hi3518ev200_lite_switcam-hs303
          - hi3518ev200_lite_switcam-hs303-v2
          - hi3518ev200_lite_vstarcam-c8892wip
          - hi3518ev200_lite_qtech-qvc-ipc-136w
          - hi3518ev300_lite_bathhouse
          - hi3518ev300_lite_xiaomi-mjsxj02hl
          - hi3518ev200_ultimate_lenovo-snowman-1080p
          - ssc30kd_lite_cmcc-ds-ytj5301
          - ssc325_lite_imilab-ec3-cmsxj25a
          - ssc325_lite_imou-c22cp
          - ssc325_lite_tp-link-tapo-c310-v1
          - ssc325_lite_trassir-tr-w2c1-v1
          - ssc325de_lite_imou-c22ep-s2
          - ssc333_lite_meari-speed-6s
          - ssc333_lite_tp-link-tapo-c110-v2
          - ssc333_lite_tp-link-tapo-c110-v26
          - ssc333_lite_babysense-see-hd-ip206
          - ssc333_lite_vstarcam-c43s_b
          - ssc335_lite_tp-link-tapo-c110-v1
          - ssc335_lite_trassir-tr-w2c1-v2
          - ssc335de_lite_dahua-hfw1230sp-v2
          - ssc335de_lite_imou-c22e-s2-v2
          - ssc335de_lite_uniview-c1l-2wn-g
          - ssc337_lite_h3c-tc2101
          - ssc337_lite_tiandy-tc-c321n-v2
          - ssc337_lite_tp-link-tapo-c110-v1
          - ssc337de_ultimate_foscam-x5
          - ssc338q_fpv_caddx-fly
          - ssc338q_fpv_emax-wyvern-link
          - ssc338q_fpv_openipc-mario-aio
          - ssc338q_fpv_openipc-thinker-aio
          - ssc338q_fpv_openipc-urllc-aio
          - ssc338q_fpv_runcam-wifilink
          - t10_lite_hb-wifi-z6
          - t10_lite_jvs-ingt10-gqs60ep
          - t20_ultimate_azarton-c1
          - t20_lite_ec37-t11
          - t31_lite_vstarcam-cs55
          - t21_lite_chinamobile-hdc-51-a5-v12
          - t21_lite_smartwares-cip-37210at
          - t21_lite_xyx-06s
          - t21_lite_wansview-q5-1080p
          - t23_lite_jooan-a6m-u
          - t23_lite_jooan-q3r-u
          - t23_lite_lsc-3215672
          - t31_lite_aceline-aip-o4
          - t31_lite_wansview-q5-2k
          - t31_lite_aoni-ep01j05
          - t31_lite_chinamobile-hdc-51-a6-v11
          - t31_lite_cmcc-hdc-51-a6-v10
          - t31_lite_chinatelecom-y4h-50
          - t31_lite_wyze-v3b
          - t31_lite_xiaomi-mjsxj03hl
          - t31_lite_xiaomi-mjsxj03hl-jxq03
          - t31_lite_tuya-gv7630-t31-ptz
          - t31_ultimate_azarton-c1-t31x
          - t31_ultimate_gcraftsman-gca50
          - t31_lite_zte-k540
          - t40_lite_movols-mo-805p

          # APFPV
          - ssc338q_apfpv
          - ssc378qe_apfpv

          # FPV
          - hi3516ev200_fpv
          - hi3516ev300_fpv
          - hi3536dv100_fpv
          - gk7205v200_fpv
          - gk7205v210_fpv
          - gk7205v300_fpv
          - ssc30kq_fpv
          - ssc338q_fpv
          - ssc378qe_fpv

          # Ruby
          - ssc30kq_rubyfpv_generic
          - ssc338q_rubyfpv_generic
          - ssc338q_rubyfpv_thinker_internal_wifi

          # LTE
          - hi3516ev200_lte
          - hi3516ev300_lte
          - gk7205v200_lte
          - gk7205v300_lte

          # Venc
          - gk7205v200_venc
          - gk7205v210_venc
          - gk7205v300_venc

          # Mini
          - hi3516cv300_mini
          - hi3518ev200_mini

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Prepare firmware
        run: |
          echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
          echo CACHE_DATE=$(date +%m) >> ${GITHUB_ENV}
          INPUT=${{inputs.platform}}
          MATRIX=$(echo ${{matrix.platform}} | cut -d_ -f1)
          if [ -z ${INPUT} ] || [ ${INPUT} = ${MATRIX} ]; then
            echo RUN=${MATRIX} >> ${GITHUB_ENV}
          fi

      - name: Setup ccache
        if: env.RUN
        uses: actions/cache@v4
        with:
          path: /tmp/ccache
          key: ${{matrix.platform}}-${{env.CACHE_DATE}}

      - name: Build firmware
        if: env.RUN
        run: |
          export GIT_HASH=$(git rev-parse --short ${GITHUB_SHA})
          export GIT_BRANCH=${GITHUB_REF_NAME}
          echo GIT_HASH=${GIT_HASH} >> ${GITHUB_ENV}
          echo GIT_BRANCH=${GIT_BRANCH} >> ${GITHUB_ENV}

          mkdir -p /tmp/ccache
          ln -s /tmp/ccache ${HOME}/.ccache

          NAME=${{matrix.platform}}
          bash builder.sh ${NAME}
          cd openipc

          TIME=$(date -d @${SECONDS} +%M:%S)
          echo TIME=${TIME} >> ${GITHUB_ENV}
          COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}')

          NORFW=$(find output/images -name openipc*nor*)
          if [ ! -z ${NORFW} ]; then
            if [ ${COMMON} -eq 1 ]; then
              echo NORFW=openipc/${NORFW} >> ${GITHUB_ENV}
            else
              mv ${NORFW} ../${NAME}-nor.tgz
              echo NORFW=${NAME}-nor.tgz >> ${GITHUB_ENV}
            fi
          fi

          NANDFW=$(find output/images -name openipc*nand*)
          if [ ! -z ${NANDFW} ]; then
            if [ ${COMMON} -eq 1 ]; then
              echo NANDFW=openipc/${NANDFW} >> ${GITHUB_ENV}
            else
              mv ${NANDFW} ../${NAME}-nand.tgz
              echo NANDFW=${NAME}-nand.tgz >> ${GITHUB_ENV}
            fi
          fi

          if [ -z ${NORFW} ] && [ -z ${NANDFW} ]; then
            exit 1
          fi

      - name: Upload firmware
        if: env.NORFW || env.NANDFW
        uses: softprops/action-gh-release@v2
        with:
          tag_name: latest
          files: |
            ${{env.NORFW}}
            ${{env.NANDFW}}

      - name: Send binary
        if: env.NORFW
        run: |
          TG_MSG="Commit: ${GIT_HASH}\nBranch: ${GIT_BRANCH}\nTag: ${TAG_NAME}\nTime: ${TIME}\n\n"
          TG_ICON="\xE2\x9C\x85 GitHub Actions"
          TG_HEADER=$(echo -e ${TG_MSG}${TG_ICON})
          TG_TOKEN=${{secrets.TELEGRAM_TOKEN_BOT_OPENIPC}}
          TG_CHANNEL=${{secrets.TELEGRAM_CHANNEL_OPENIPC_DEV}}
          HTTP=$(curl -s -o /dev/null -w %{http_code} https://api.telegram.org/bot${TG_TOKEN}/sendDocument -F chat_id=${TG_CHANNEL} -F caption="${TG_HEADER}" -F document=@${NORFW})
          echo Telegram response: ${HTTP}
