buildPdfDataTable function

Widget buildPdfDataTable({
  1. required Map<DateTime, double> dailyData,
  2. required Map<DateTime, (double, double)> dailyMinMax,
  3. required String dataType,
  4. required String unit,
  5. Map<DateTime, int>? precipitationHours,
})

Build data table for PDF showing daily weather statistics.

Implementation

pw.Widget buildPdfDataTable({
  required Map<DateTime, double> dailyData,
  required Map<DateTime, (double, double)> dailyMinMax,
  required String dataType,
  required String unit,
  Map<DateTime, int>? precipitationHours,
}) {
  final dateFormat = DateFormat('yyyy-MM-dd');

  return pw.TableHelper.fromTextArray(
    headerStyle: pw.TextStyle(fontWeight: pw.FontWeight.bold),
    cellStyle: const pw.TextStyle(fontSize: 10),
    headerDecoration: const pw.BoxDecoration(color: PdfColors.grey300),
    cellHeight: 25,
    cellAlignments: {
      0: pw.Alignment.centerLeft,
      1: pw.Alignment.centerRight,
      2: pw.Alignment.centerRight,
      3: pw.Alignment.centerRight,
    },
    headers: [
      'Date',
      dataType == 'precipitation' ? 'Total$unit' : 'Average$unit',
      dataType == 'precipitation' ? 'Hours' : 'Min$unit',
      dataType == 'precipitation' ? 'Max mm/h' : 'Max$unit',
    ],
    data: (dailyData.entries.toList()..sort((a, b) => a.key.compareTo(b.key)))
        .map((entry) {
          final date = entry.key;

          // For precipitation: dailyData contains daily totals
          // For other types: dailyData contains daily averages.
          final value = entry.value;
          final (dayMin, dayMax) = dailyMinMax[date] ?? (value, value);

          // For precipitation, show hours with rain and max hourly rate.
          final secondCol = dataType == 'precipitation'
              ? (precipitationHours?[date] ?? 0).toString()
              : dayMin.toStringAsFixed(1);

          return [
            dateFormat.format(date),
            value.toStringAsFixed(1),
            secondCol,
            dayMax.toStringAsFixed(1),
          ];
        })
        .toList(),
  );
}