import 'dart:convert';

import 'package:fis_lib_report/converts/event_type.dart';
import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
import 'package:fis_lib_report/pages/block_element_page.dart';
import 'package:fis_lib_report/report/interfaces/block_element.dart';
import 'package:fis_lib_report/report/report_template_document.dart';
import 'package:fis_lib_report/report/rt_thickness.dart';
import 'package:fis_lib_report/report_info/report_event_args.dart';
import 'package:fis_lib_report/report_info/report_info.dart';
import 'package:flutter/material.dart';

class ReportEditPage extends StatefulWidget {
  ReportEditPage({
    Key? key,
    required this.reporter,
    required this.jsonStr,
    required this.reportDate,
    required this.onSelect,
    this.patinentAge,
    this.patinentName,
    this.patinentSex,
    this.patinentId,
    this.isReload = true,
  }) : super(key: key);

  final FEventHandler<String> onSelect;

  final String jsonStr;
  final String reporter;
  final String? patinentName;
  final String? patinentId;
  final String? patinentSex;
  final String? patinentAge;
  final DateTime reportDate;
  bool isReload;

  @override
  State<ReportEditPage> createState() {
    return _ReportEditPageState();
  }
}

class _ReportEditPageState extends State<ReportEditPage> {
  ReportTemplateDocument _reportTemplate = ReportTemplateDocument();
  double _height = 0;
  double _width = 0;
  List<IBlockElement> _blocks = [];
  List<IBlockElement> _header = [];
  List<IBlockElement> _footer = [];
  EdgeInsetsGeometry _padding = EdgeInsets.all(PtToPxConverter.ptToPx(56.83));
  bool isInit = false;

  @override
  initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    if (widget.jsonStr.isEmpty) {
      return const SizedBox();
    }
    if (widget.isReload) {
      _intitTemplate();
      _initListentener();
      widget.isReload = false;
    }
    final pagePadding = _reportTemplate.pagePadding ?? RTThickness.uniform(56);
    return Center(
      child: Container(
        padding: _padding,
        alignment: Alignment.center,
        height: _height,
        width: _width,
        color: Colors.white,
        child: ListView(
          controller: ScrollController(),
          children: [
            ..._header.map((head) {
              return Container(
                width: _width,
                alignment: Alignment.center,
                child: BlockElementPage(element: head),
              );
            }),
            ..._blocks.map((block) {
              return Container(
                alignment: Alignment.center,
                width: _width,
                child: BlockElementPage(element: block),
              );
            }),
            const SizedBox(height: 10),
            ..._footer.map((footer) {
              return SizedBox(
                width: _width -
                    PtToPxConverter.ptToPx(
                        pagePadding.left! + pagePadding.right!),
                child: BlockElementPage(element: footer),
              );
            }),
          ],
        ),
      ),
    );
  }

  BoxDecoration _buildDecoration() {
    return BoxDecoration(
        border: Border.all(
          width: 0.5,
          color: const Color.fromARGB(255, 83, 83, 83),
        ),
        color: Colors.white);
  }

  void _intitTemplate({ReportEventArgs? args}) {
    String jsonStr = widget.jsonStr;
    DateTime reportDate = widget.reportDate;
    String reporter = widget.reporter;
    if (args != null) {
      jsonStr = args.jsonStr;
      reporter = args.reporter;
      reportDate = args.reportDate;
      ReportInfo.instance.onReload.addListener((sender, e) {
        _header.clear();
        _blocks.clear();
        _footer.clear();
        widget.onSelect.dispose();
        _intitTemplate(args: e);
        ReportInfo.instance.onReloadFinsh.emit(this, '');
      });
    }
    if (jsonStr.isEmpty) {
      return;
    }
    final reportMap = jsonDecode(jsonStr);

    setState(() {
      final template = ReportTemplateDocument.fromJson(reportMap);
      _reportTemplate = template;
      ReportInfo.instance.init(_reportTemplate, reportDate, reporter,
          patientName: widget.patinentName,
          patientAge: widget.patinentAge,
          patientSex: widget.patinentSex,
          patinentId: widget.patinentId);
      _initPage();
    });
    if (args != null) {
      args.onSelect.addListener((sender, e) {
        ReportInfo.instance.selectedInputImage(e);
      });
      ReportInfo.instance.onClose.addListener((sender, e) {
        if (mounted) {
          setState(() {
            _header.clear();
            _blocks.clear();
            _footer.clear();
            widget.onSelect.dispose();
          });
        }
      });
    } else {
      widget.onSelect.addListener((sender, e) {
        ReportInfo.instance.selectedInputImage(e);
      });
    }
    isInit = true;
  }

  void _initListentener() {
    ReportInfo.instance.onReload.addListener((sender, e) {
      _header.clear();
      _blocks.clear();
      _footer.clear();
      widget.onSelect.dispose();
      _intitTemplate(args: e);
      ReportInfo.instance.onReloadFinsh.emit(this, '');
    });
    ReportInfo.instance.onClose.addListener((sender, e) {
      if (mounted) {
        setState(() {
          _header.clear();
          _blocks.clear();
          _footer.clear();
          widget.onSelect.dispose();
        });
      }
    });
  }

  void _initPage() {
    try {
      _height = PtToPxConverter.ptToPx(_reportTemplate.pageSize!.height);
      _width = PtToPxConverter.ptToPx(_reportTemplate.pageSize!.width);
      final pagePadding =
          _reportTemplate.pagePadding ?? RTThickness.uniform(56);
      _padding = EdgeInsets.only(
        left: PtToPxConverter.ptToPx(pagePadding.left),
        right: PtToPxConverter.ptToPx(pagePadding.right),
        top: PtToPxConverter.ptToPx(pagePadding.top),
        bottom: PtToPxConverter.ptToPx(pagePadding.bottom),
      );
      _footer = _reportTemplate.footer ?? [];
      _blocks = _reportTemplate.blocks ?? [];
      _header = _reportTemplate.header ?? [];
    } catch (e) {
      _height = 841.8897637795275;
      _width = 595.275590551181;
    }
  }

  @override
  void dispose() {
    ReportInfo.instance.onReload.dispose();
    super.dispose();
  }
}