///|
fn issue(severity : Severity, file : String, message : String) -> DocIssue {
  { severity, file, line: None, message }
}

///|
fn add_readme_issues(issues : Array[DocIssue], report : ProjectReport) -> Unit {
  if !report.readme.found {
    issues.push(issue(Warning, "README", "README file not found"))
  } else {
    if !report.readme.has_overview {
      issues.push(
        issue(Warning, "README", "README is missing project overview"),
      )
    }
    if !report.readme.has_usage {
      issues.push(
        issue(Warning, "README", "README is missing documentation entry"),
      )
    }
    if !report.readme.has_license_mention {
      issues.push(
        issue(Suggestion, "README", "README does not mention the license"),
      )
    }
  }
}

///|
fn add_moon_mod_issues(
  issues : Array[DocIssue],
  report : ProjectReport,
) -> Unit {
  if !report.moon_mod.found {
    issues.push(issue(Warning, "moon.mod", "`moon.mod` file not found"))
  } else {
    if !report.moon_mod.has_name {
      issues.push(issue(Warning, "moon.mod", "`moon.mod` is missing `name`"))
    }
    if !report.moon_mod.has_version {
      issues.push(issue(Warning, "moon.mod", "`moon.mod` is missing `version`"))
    }
    if !report.moon_mod.has_license {
      issues.push(issue(Warning, "moon.mod", "`moon.mod` is missing `license`"))
    }
    if !report.moon_mod.has_description {
      issues.push(
        issue(Suggestion, "moon.mod", "`moon.mod` is missing `description`"),
      )
    }
    if !report.moon_mod.has_repository {
      issues.push(
        issue(Suggestion, "moon.mod", "`moon.mod` is missing `repository`"),
      )
    }
    if !report.moon_mod.has_keywords {
      issues.push(
        issue(Suggestion, "moon.mod", "`moon.mod` is missing `keywords`"),
      )
    }
    if !report.moon_mod.has_readme {
      issues.push(
        issue(Suggestion, "moon.mod", "`moon.mod` is missing `readme`"),
      )
    }
  }
}

///|
fn add_ci_issues(issues : Array[DocIssue], report : ProjectReport) -> Unit {
  if report.ci.workflow_files == 0 {
    issues.push(
      issue(
        Suggestion,
        ".github/workflows",
        "GitHub Actions workflow not found",
      ),
    )
  } else {
    if !report.ci.has_moon_check {
      issues.push(
        issue(Warning, ".github/workflows", "CI does not run `moon check`"),
      )
    }
    if !report.ci.has_moon_test {
      issues.push(
        issue(Warning, ".github/workflows", "CI does not run `moon test`"),
      )
    }
    if !report.ci.has_moon_fmt {
      issues.push(
        issue(Suggestion, ".github/workflows", "CI does not run `moon fmt`"),
      )
    }
    if !report.ci.has_moon_info {
      issues.push(
        issue(Suggestion, ".github/workflows", "CI does not run `moon info`"),
      )
    }
  }
}

///|
fn add_generated_mbti_issues(
  issues : Array[DocIssue],
  report : ProjectReport,
) -> Unit {
  if !report.has_generated_mbti {
    issues.push(
      issue(
        Warning,
        "pkg.generated.mbti",
        "Generated interface summary not found; run `moon info` before publishing or review",
      ),
    )
  }
}

///|
fn add_coverage_issues(
  issues : Array[DocIssue],
  report : ProjectReport,
  config : ScanConfig,
) -> Unit {
  match config.coverage.min_public_api_coverage {
    Some(minimum) =>
      if report.documentation_coverage < minimum {
        issues.push(
          issue(
            Warning,
            report.project_name,
            "Public API documentation coverage is below configured minimum " +
            minimum.to_string() +
            "%",
          ),
        )
      }
    None => ()
  }
}

///|
/// Build project-readiness issues from scan facts and configured rules.
pub fn project_readiness_issues(
  report : ProjectReport,
  config : ScanConfig,
) -> Array[DocIssue] {
  let issues : Array[DocIssue] = []
  if config.rules.check_readme {
    add_readme_issues(issues, report)
  }
  if config.rules.check_moon_mod {
    add_moon_mod_issues(issues, report)
  }
  if config.rules.check_ci {
    add_ci_issues(issues, report)
  }
  if config.rules.check_generated_mbti {
    add_generated_mbti_issues(issues, report)
  }
  add_coverage_issues(issues, report, config)
  issues
}