generateReport function

Future<Uint8List> generateReport(
  1. PdfPageFormat pageFormat,
  2. Map<String, dynamic> json
)

Implementation

Future<Uint8List> generateReport(
    PdfPageFormat pageFormat, Map<String, dynamic> json) async {
  const baseColor = Constant.basecolor;
  final document = pw.Document();
  final theme = pw.ThemeData.withFont(
    base: await PdfGoogleFonts.openSansRegular(),
    bold: await PdfGoogleFonts.openSansBold(),
  );

  // Future<String> getJson() {
  //   return rootBundle.loadString('report_data.json');
  // }

  Map<String, dynamic> reportData = json;

  var newFormat = DateFormat("jm");
  DateTime startTime = DateTime.parse(reportData["created_at"]);
  DateTime finishTime = DateTime.parse(reportData["finished_at"]);
  Duration difference = finishTime.difference(startTime);

  List<int> xAxis = [];
  List<int> yAxis = [];
  List<int> stressplot = [];
  List<int> recoveryplot = [];
  List<int> stepcount = [];
  List<int> activityplot = [];
  List<Map<String, dynamic>> seriesdata = [];

  Details user = Details();
  ChartBar barlist = ChartBar();
  Conversion convert = Conversion();
  LegendList legendinfo = LegendList();
  ChartTitle chartname = ChartTitle();

  List<String> charttitle = Constant.charttitle;

  List<dynamic> reportActivities = reportData["activities"];
  reportActivities
      .map((activity) => convert.activitytoseriesdata(activity, seriesdata))
      .toList();

  List<dynamic> reportCommontime = reportData["common_time"];
  xaxisTimestampconvert(commontime) {
    int commontimeConvert = DateTime.parse(commontime).millisecondsSinceEpoch;
    xAxis.add(commontimeConvert);
  }

  reportCommontime
      .map((timestamp) => xaxisTimestampconvert(timestamp))
      .toList();

  List<dynamic> reportProcessedhr = reportData["processed_hr"];
  reportProcessedhr.map((hrvalue) => yAxis.add(hrvalue)).toList();

  List<dynamic> reportStressscore = reportData["stress_scores"];
  reportStressscore.map((stressvalue) => stressplot.add(stressvalue)).toList();

  List<dynamic> reportRecoverylabel = reportData["recovery_label"];
  reportRecoverylabel
      .map((recoveryvalue) => recoveryplot.add(recoveryvalue))
      .toList();

  List<dynamic> reportStepcount = reportData["step_count"];
  reportStepcount.map((countvalue) => stepcount.add(countvalue)).toList();

  List<dynamic> reportActivitylevel = reportData["activity_level"];
  reportActivitylevel
      .map((activityvalue) => activityplot.add(activityvalue))
      .toList();

  String filterXaxis(int time) {
    DateTime timestamp = DateTime.fromMillisecondsSinceEpoch(time);
    return convert.xaxisTimestampFilter(timestamp, difference);
  }

  List<Userinfo> title = [];
  title.add(Userinfo(field: Constant.name, value: reportData["name"]));
  title.add(Userinfo(field: Constant.age, value: reportData["age"]));
  title.add(Userinfo(field: Constant.height, value: reportData["height"]));
  title.add(Userinfo(field: Constant.weight, value: reportData["weight"]));
  title.add(Userinfo(field: Constant.gender, value: reportData["gender"]));
  title.add(Userinfo(field: Constant.bmi, value: reportData["bmi"]));
  title.add(
      Userinfo(field: Constant.restinghr, value: reportData["resting_hr"]));
  title.add(
      Userinfo(field: Constant.maximumhr, value: reportData["maximum_hr"]));

  String formattedstartsession = user.format(reportData["created_at"]);

  title.add(
      Userinfo(field: Constant.sessionstartdate, value: formattedstartsession));

  String formattedStopSession = user.format(reportData["finished_at"]);
  title.add(
      Userinfo(field: Constant.sessionstarttime, value: formattedStopSession));

  format(Duration d) => d.toString().split('.').first.padLeft(8, "0");
  String sessionduration = format(difference).toString();
  title.add(Userinfo(field: Constant.sessionduration, value: sessionduration));

  int lowhr = reportData["min_session_hr_bpm"];
  int avghr = reportData["avg_session_hr_bpm"];
  int maxhr = reportData["max_session_hr_bpm"];
  String hrvalue = "$lowhr/$avghr/$maxhr bpm";
  title.add(Userinfo(field: Constant.hrLAH, value: hrvalue));

  final chart1 = pw.Chart(
    left: chartname.leftlabel(),
    grid: chartname.chartaxis(xAxis, filterXaxis),
    datasets: [
      chartname.linegraph(baseColor, yAxis, xAxis),
      for (int i = 0; i < seriesdata.length; i++)
        barlist.bardataList(reportData, newFormat, seriesdata, i),
    ],
  );

  final chart2 = pw.Chart(
    left: chartname.leftlabel(),
    grid: chartname.chartaxis(xAxis, filterXaxis),
    datasets: [
      chartname.linegraph(baseColor, yAxis, xAxis),
      for (int i = 0; i < stressplot.length; i++)
        barlist.stressBar(stressplot, xAxis, yAxis, i)
    ],
  );

  final chart3 = pw.Chart(
    left: chartname.leftlabel(),
    grid: chartname.chartaxis(xAxis, filterXaxis),
    datasets: [
      chartname.linegraph(baseColor, yAxis, xAxis),
      for (int i = 0; i < reportData["recovery_label"].length; i++)
        barlist.recoverybar(recoveryplot, xAxis, yAxis, i)
    ],
  );

  final chart4 = pw.Chart(
    left: pw.Container(
      alignment: pw.Alignment.center,
      margin: const pw.EdgeInsets.only(right: 5, top: 10),
      child: pw.Transform.rotateBox(
          angle: pi / 2,
          child: pw.Text(Constant.leftlabel_atv,
              style: const pw.TextStyle(fontSize: 8))),
    ),
    grid: pw.CartesianGrid(
      xAxis: pw.FixedAxis(xAxis,
          textStyle: pw.TextStyle(fontSize: 8),
          format: (axisvalue) => filterXaxis(axisvalue as int),
          divisions: false),
      yAxis: pw.FixedAxis(
        [0, 30, 60, 90, 120],
        textStyle: pw.TextStyle(fontSize: 8),
        format: (v) => '$v',
        divisions: false,
      ),
    ),
    datasets: [
      for (int i = 0; i < reportData["step_count"].length; i++)
        barlist.activitybar(activityplot, xAxis, stepcount, i)
    ],
  );

  document.addPage(
    pw.Page(
      pageFormat: pageFormat,
      theme: theme,
      build: (context) {
        // Page layout
        return pw.Column(
          children: [
            pw.Container(
                width: double.infinity,
                height: 25,
                color: Constant.titlebackground,
                child: chartname.sessionheading()),
            user.user_info(title),
            chartname.graphtitle(charttitle[0], baseColor),
            pw.SizedBox(
                width: double.infinity,
                height: 80,
                child: pw.Container(child: chart1)),
            legendinfo.legendone(seriesdata, reportData),
            pw.SizedBox(height: 5),
            chartname.graphtitle(charttitle[1], baseColor),
            pw.SizedBox(
              width: double.infinity,
              height: 80,
              child: pw.Container(child: chart2),
            ),
            legendinfo.legendtwo(),
            pw.SizedBox(height: 5),
            chartname.graphtitle(charttitle[2], baseColor),
            pw.SizedBox(
              width: double.infinity,
              height: 80,
              child: pw.Container(child: chart3),
            ),
            legendinfo.legendthree(),
            pw.SizedBox(height: 5),
            chartname.graphtitle(charttitle[3], baseColor),
            pw.SizedBox(
              width: double.infinity,
              height: 80,
              child: pw.Container(child: chart4),
            ),
            legendinfo.legendfour()
          ],
        );
      },
    ),
  );

  return document.save();
}