name: Verification of Job Templates

on:
  push:
  workflow_dispatch:

jobs:
  Prepare:
    uses: pyTooling/Actions/.github/workflows/PrepareJob.yml@r6

  ConfigParams:
    uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r6

  UnitTestingParams:
    uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
    with:
      package_name:        'myPackage'
      python_version_list: '3.9 3.10 3.11 3.12 3.13 3.14 pypy-3.10 pypy-3.11'
      disable_list:        'windows-arm:pypy-3.10 windows-arm:pypy-3.11'

  PlatformTestingParams:
    uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
    with:
      package_name:        'myPackage'
      name:                'Platform'
      python_version_list: ''
      system_list:         'ubuntu ubuntu-arm windows windows-arm macos mingw64 clang64 ucrt64'

  InstallParams:
    uses: pyTooling/Actions/.github/workflows/Parameters.yml@r6
    with:
      package_name:        'myPackage'
      python_version:      ${{ needs.UnitTestingParams.outputs.python_version }}
      python_version_list: ''

  UnitTesting:
    uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
    needs:
      - ConfigParams
      - UnitTestingParams
    with:
      jobs:                     ${{ needs.UnitTestingParams.outputs.python_jobs }}
      unittest_report_xml:      ${{ needs.ConfigParams.outputs.unittest_report_xml }}
      coverage_report_xml:      ${{ needs.ConfigParams.outputs.coverage_report_xml }}
      coverage_report_json:     ${{ needs.ConfigParams.outputs.coverage_report_json }}
      coverage_report_html:     ${{ needs.ConfigParams.outputs.coverage_report_html }}
      unittest_xml_artifact:    ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
      unittest_html_artifact:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }}
      coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
      coverage_xml_artifact:    ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
      coverage_json_artifact:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
      coverage_html_artifact:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}

  PlatformTesting:
    uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r6
    needs:
      - ConfigParams
      - PlatformTestingParams
    with:
      jobs:                     ${{ needs.PlatformTestingParams.outputs.python_jobs }}
#      tests_directory: ""
      unittest_directory:       platform
      unittest_report_xml:      ${{ needs.ConfigParams.outputs.unittest_report_xml }}
      coverage_report_xml:      ${{ needs.ConfigParams.outputs.coverage_report_xml }}
      coverage_report_json:     ${{ needs.ConfigParams.outputs.coverage_report_json }}
      coverage_report_html:     ${{ needs.ConfigParams.outputs.coverage_report_html }}
      unittest_xml_artifact:    ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).unittesting_xml }}
      unittest_html_artifact:   ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).unittesting_html }}
      coverage_sqlite_artifact: ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_sqlite }}
      coverage_xml_artifact:    ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_xml }}
      coverage_json_artifact:   ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_json }}
      coverage_html_artifact:   ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_html }}

  StaticTypeCheck:
    uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r6
    needs:
      - ConfigParams
      - UnitTestingParams
    with:
      python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
      html_report:    ${{ needs.ConfigParams.outputs.typing_report_html }}
      html_artifact:  ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}

  CodeQuality:
    uses: pyTooling/Actions/.github/workflows/CheckCodeQuality.yml@r6
    needs:
      - UnitTestingParams
    with:
      python_version:    ${{ needs.UnitTestingParams.outputs.python_version }}
      package_directory: ${{ needs.UnitTestingParams.outputs.package_directory }}
      artifact:          CodeQuality

  DocCoverage:
    uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@r6
    needs:
      - ConfigParams
      - UnitTestingParams
    with:
      python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
      directory     : ${{ needs.ConfigParams.outputs.package_directory }}
#      fail_below: 70

  Package:
    uses: pyTooling/Actions/.github/workflows/Package.yml@r6
    needs:
      - UnitTestingParams
#      - UnitTesting
#      - PlatformTesting
    with:
      python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
      artifact:       ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}

  Install:
    uses: pyTooling/Actions/.github/workflows/InstallPackage.yml@r6
    needs:
      - UnitTestingParams
      - InstallParams
      - Package
    with:
      jobs:         ${{ needs.InstallParams.outputs.python_jobs }}
      wheel:        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
      package_name: ${{ needs.UnitTestingParams.outputs.package_fullname }}

  PublishCoverageResults:
    uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r6
    needs:
      - ConfigParams
      - UnitTestingParams
      - UnitTesting
      - PlatformTesting
    with:
      coverage_report_xml:      ${{ needs.ConfigParams.outputs.coverage_report_xml }}
      coverage_report_json:     ${{ needs.ConfigParams.outputs.coverage_report_json }}
      coverage_report_html:     ${{ needs.ConfigParams.outputs.coverage_report_html }}
      coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
      coverage_xml_artifact:    ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
      coverage_json_artifact:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
      coverage_html_artifact:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
      codecov:                  true
      codacy:                   true
    secrets: inherit

  PublishTestResults:
    uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r6
    needs:
      - ConfigParams
      - UnitTestingParams
      - UnitTesting
      - PlatformTesting
    with:
      additional_merge_args:  '-d "--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit;reduce-depth:pytest.tests.platform"'
      testsuite-summary-name: ${{ needs.UnitTestingParams.outputs.package_fullname }}
      merged_junit_artifact:  ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
      codecov:                true
      dorny:                  true
    secrets: inherit

#  VerifyDocs:
#    uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r6
#    needs:
#      - UnitTestingParams
#    with:
#      python_version: ${{ needs.UnitTestingParams.outputs.python_version }}

  Documentation:
    uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r6
    needs:
      - ConfigParams
      - UnitTestingParams
      - PublishTestResults
      - PublishCoverageResults
#      - VerifyDocs
    with:
      python_version:         ${{ needs.UnitTestingParams.outputs.python_version }}
      unittest_xml:           ${{ needs.ConfigParams.outputs.unittest_report_xml }}
      coverage_report_json:   ${{ needs.ConfigParams.outputs.coverage_report_json }}
      unittest_xml_artifact:  ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
      coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
      html_artifact:          ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
      latex_artifact:         ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}

  IntermediateCleanUp:
    uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@r6
    needs:
      - UnitTestingParams
      - PublishCoverageResults
      - PublishTestResults
    with:
      sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}-
      xml_unittest_artifacts_prefix:    ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-

  PDFDocumentation:
    uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@r6
    needs:
      - UnitTestingParams
      - Documentation
    with:
      document:       'Actions'
      latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
      pdf_artifact:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }}

  PublishToGitHubPages:
    uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r6
    needs:
      - UnitTestingParams
      - Documentation
      - PDFDocumentation
      - PublishCoverageResults
      - StaticTypeCheck
    with:
      doc:      ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
      coverage: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
      typing:   ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}

  TriggerTaggedRelease:
    uses: pyTooling/Actions/.github/workflows/TagReleaseCommit.yml@r6
    needs:
      - Prepare
      - UnitTesting
      - PlatformTesting
      - Install
#      - StaticTypeCheck
      - Package
      - PublishToGitHubPages
    permissions:
      contents: write  # required for create tag
      actions:  write  # required for trigger workflow
    with:
      version:  ${{ needs.Prepare.outputs.version }}
      auto_tag: ${{ needs.Prepare.outputs.is_release_commit }}
    secrets: inherit

  ReleasePage:
    uses: pyTooling/Actions/.github/workflows/PublishReleaseNotes.yml@r6
    needs:
      - Prepare
      - UnitTesting
      - PlatformTesting
      - Install
#      - StaticTypeCheck
      - Package
      - PublishToGitHubPages
    if: needs.Prepare.outputs.is_release_tag == 'true'
    permissions:
      contents: write
      actions:  write
    with:
      tag: ${{ needs.Prepare.outputs.version }}
    secrets: inherit

  PublishOnPyPI:
    uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r6
    needs:
      - UnitTestingParams
      - ReleasePage
#      - Package
    if: needs.Prepare.outputs.is_release_tag == 'true'
    with:
      python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
      requirements: -r dist/requirements.txt
      artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
    secrets: inherit

  ArtifactCleanUp:
    uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r6
    needs:
      - UnitTestingParams
      - PlatformTestingParams
      - UnitTesting
      - StaticTypeCheck
      - PlatformTesting
      - Documentation
      - PDFDocumentation
      - PublishTestResults
      - PublishCoverageResults
      - PublishToGitHubPages
      - IntermediateCleanUp
    with:
      package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
      remaining: |
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-*
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }}-*
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}-*
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}-*
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}-*
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
        ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
        ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).unittesting_xml }}-*
        ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).unittesting_html }}-*
        ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_xml }}-*
        ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_json }}-*
        ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_html }}-*
