toMarkdown method

String toMarkdown()

Generate markdown report.

Implementation

String toMarkdown() {
  final buffer = StringBuffer();

  buffer.writeln('# Technical Debt Report');
  buffer.writeln();

  // Summary section
  buffer.writeln('## Summary');
  buffer.writeln();
  buffer.writeln(
      '- **Total Cost**: ${summary.totalCost.toStringAsFixed(1)} ${summary.unit}');
  buffer.writeln('- **Items**: ${summary.itemCount}');
  buffer.writeln(
      '- **Threshold**: ${summary.threshold.toStringAsFixed(1)} ${summary.unit}');
  buffer.writeln(
      '- **Status**: ${summary.exceedsThreshold ? "EXCEEDS THRESHOLD" : "OK"}');
  buffer.writeln();

  // Breakdown by type
  buffer.writeln('## Breakdown by Type');
  buffer.writeln();
  buffer.writeln('| Type | Count | Cost |');
  buffer.writeln('|------|-------|------|');

  for (final typeSummary in summary.typesByHighestCost) {
    if (typeSummary.count > 0) {
      buffer.writeln(
          '| ${typeSummary.type.label} | ${typeSummary.count} | '
          '${typeSummary.cost.toStringAsFixed(1)} ${summary.unit} |');
    }
  }
  buffer.writeln();

  // Breakdown by severity
  buffer.writeln('## Breakdown by Severity');
  buffer.writeln();
  buffer.writeln('| Severity | Cost |');
  buffer.writeln('|----------|------|');

  for (final severity in DebtSeverity.values) {
    final cost = summary.getCostForSeverity(severity);
    if (cost > 0) {
      buffer.writeln(
          '| ${severity.label} | ${cost.toStringAsFixed(1)} ${summary.unit} |');
    }
  }
  buffer.writeln();

  // Hotspots
  final hotspots = getHotspots(10);
  if (hotspots.isNotEmpty) {
    buffer.writeln('## Hotspots (Top 10 Files)');
    buffer.writeln();
    buffer.writeln('| File | Items | Cost |');
    buffer.writeln('|------|-------|------|');

    for (final file in hotspots) {
      buffer.writeln(
          '| ${file.filePath} | ${file.itemCount} | '
          '${file.totalCost.toStringAsFixed(1)} ${summary.unit} |');
    }
    buffer.writeln();
  }

  // Critical items
  final criticalItems = getItemsBySeverity(DebtSeverity.critical);
  if (criticalItems.isNotEmpty) {
    buffer.writeln('## Critical Items');
    buffer.writeln();

    for (final item in criticalItems) {
      buffer.writeln(
          '- **${item.type.label}** at `${item.filePath}:${item.location.start.line}`');
      buffer.writeln('  - ${item.description}');
      if (item.context != null) {
        buffer.writeln('  - Context: `${item.context}`');
      }
    }
    buffer.writeln();
  }

  // High priority items
  final highItems = getItemsBySeverity(DebtSeverity.high);
  if (highItems.isNotEmpty) {
    buffer.writeln('## High Priority Items');
    buffer.writeln();

    for (final item in highItems.take(20)) {
      buffer.writeln(
          '- **${item.type.label}** at `${item.filePath}:${item.location.start.line}`');
      buffer.writeln('  - ${item.description}');
    }

    if (highItems.length > 20) {
      buffer.writeln();
      buffer.writeln('_...and ${highItems.length - 20} more high priority items_');
    }
    buffer.writeln();
  }

  return buffer.toString();
}