import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
import 'package:fis_lib_report/converts/text_size_converter.dart';
import 'package:fis_lib_report/converts/alignment_convert.dart';
import 'package:fis_lib_report/report/element_tag.dart';
import 'package:fis_lib_report/report/inputText.dart';
import 'package:fis_lib_report/report_info/element_tag_names.dart';
import 'package:fis_lib_report/report_info/input_text_info.dart';
import 'package:fis_lib_report/report_info/report_info.dart';
import 'package:flutter/material.dart';

class RInputText extends StatefulWidget {
  final InputText inputText;

  const RInputText({Key? key, required this.inputText}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _RInputTextState();
  }
}

class _RInputTextState extends State<RInputText> {
  _RInputTextState();
  final _controller = TextEditingController();
  final _focusNode = FocusNode();
  double _lineWidth = 136.0;
  double _fontSize = 22.0;
  double _height = 22.0;
  double _allHeight = 0.0;
  bool _textWrap = false;
  Color _fontColor = const Color.fromARGB(255, 0, 0, 0);
  Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
  int _lineLength = 1;
  TextStyle? _textStyle;
  InputTextInfo? _inputTextInfo;
  bool _isReadOnly = false;
  bool _widthLock = false;
  int _rowCount = 1;

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

  @override
  Widget build(BuildContext context) {
    _checkInputTextInfo();
    _initStyle();

    return Column(
      children: [
        Container(
          width: _lineWidth,
          height: _allHeight,
          padding: const EdgeInsets.only(right: 5, left: 5),
          decoration: BoxDecoration(
            border: Border.all(
              width: 1,
              color: _isReadOnly ? Colors.transparent : Colors.grey,
            ),
            color: _backgroundColor,
          ),
          child: TextField(
              focusNode: _focusNode,
              readOnly: _isReadOnly,
              decoration: null,
              textAlignVertical: AlignmentConvert.verticalAlignmentConvert(
                  widget.inputText.verticalAlignment),
              minLines: 1,
              maxLines: _rowCount,
              controller: _controller,
              textAlign: TextAlign.start,
              style: _textStyle,
              onChanged: (v) {
                // _onInputChanged(_textStyle!, _controller.text);
              },
              onEditingComplete: () {
                _onInputChanged(_textStyle!, _controller.text);
              }),
        ),
        const SizedBox(height: 3),
        if (_inputTextInfo!.tag != null &&
            _inputTextInfo!.tag!.elementTagType ==
                ElementTagType.DiagnosticEntry) ...[
          Row(
            mainAxisAlignment: MainAxisAlignment.end,
            children: [
              ElevatedButton(
                onPressed: () {
                  ReportInfo.instance.onDiagnosticTap
                      .emit(this, _inputTextInfo!.tag!.name ?? '');
                },
                child: const Text('选择词条'),
              ),
              const SizedBox(width: 10),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    _inputTextInfo!.text = '';
                  });
                },
                child: const Text('撤销'),
              ),
              const SizedBox(width: 5),
            ],
          ),
        ],
      ],
    );
  }

  //onchange 事件
  void _onInputChanged(TextStyle _textStyle, String value) {
    if (_inputTextInfo != null) {
      _inputTextInfo!.text = value;
    }
  }

  @override
  void dispose() {
    _inputTextInfo!.onTextChange.dispose();
    _controller.dispose();
    super.dispose();
  }

  void _initDatas() {
    final inputText = widget.inputText;

    _controller.text = '';
    _focusNode.addListener(() {
      if (!_focusNode.hasFocus) {
        _onInputChanged(_textStyle!, _controller.text);
      }
    });

    final inputTextInfo = ReportInfo.instance.getElementInfo(inputText);
    _inputTextInfo = inputTextInfo as InputTextInfo;
    _inputTextInfo!.onTextChange.addListener((sender, e) {
      setState(() {
        _controller.text = e;
        _syncWidth(
          inputText,
          e,
        );
      });
    });
    if (_inputTextInfo!.isReadOnly!) {
      if (_inputTextInfo!.tag!.name == TagNames.RPHYSICIAN) {
        _controller.text = ReportInfo.instance.reporter ?? '';
      }
    }
    final fontColor = inputText.fontColor;
    if (fontColor != null) {
      _fontColor = Color.fromARGB(
          fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
    }
    final backgroundColor = inputText.background;
    if (backgroundColor != null) {
      _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
          backgroundColor.g!, backgroundColor.b!);
    }

    ReportInfo.instance.onReloadFinsh.addListener((sender, e) {
      _initDatas();
    });
    setState(() {});
  }

  void _syncWidth(InputText inputText, String value) {
    final width = TextSizeConvert.getTextSize(value, _textStyle!).width + 15;

    if (inputText.tag!.name == TagNames.HOSPITALNAME) {
      if (_lineWidth < width) {
        setState(() {
          if (width < 480) {
            _lineWidth = width;
            _widthLock = true;
          }
        });
      } else if (_controller.text.isEmpty) {
        setState(() {
          //重置长度
          _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
          _widthLock = false;
        });
      } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle!)
              .width >
          inputText.lineWidth!) {
        setState(() {
          if (width < 480) {
            _lineWidth = width;
            _widthLock = true;
          }
        });
      }
    }
  }

  void _initStyle() {
    final inputText = widget.inputText;
    _textStyle ??= TextStyle(
      fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
      color: _fontColor,
    );
    _isReadOnly = inputText.isReadOnly!;
    //TODO(Loki):set FontName in TextField
    final fontName = inputText.fontName;
    //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
    final fontStyles = inputText.fontStyles;
    _lineLength = inputText.lineLength ?? 7;
    if (!_widthLock) {
      _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
    }
    _widthLock = false;
    _textWrap = inputText.textWrap ?? false;
    _rowCount = _textWrap ? 6 : 1;

    if (_inputTextInfo != null && _inputTextInfo!.text.isNotEmpty) {
      final text = _inputTextInfo!.text;
      if (text.contains('\r\n')) {
        final rowList = text.split('\r\n');
        _rowCount = rowList.length > _rowCount ? rowList.length : _rowCount;
      }
    }
    _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
    _height = _fontSize > 30 ? 44 : 22;
    _allHeight = _textWrap
        ? _height * (_rowCount - 1)
        : _fontSize > 30
            ? (_height - 2)
            : _height;
    if (_inputTextInfo != null && _textWrap) {
      final height =
          TextSizeConvert.getTextSize(_controller.text, _textStyle!).height + 5;
      if (height > _allHeight) {
        _allHeight = height;
      }
    }
  }

  void _checkInputTextInfo() {
    try {
      final inputTextInfo =
          ReportInfo.instance.getElementInfo(widget.inputText);
      if (_inputTextInfo != inputTextInfo) {
        if (_inputTextInfo != null) _inputTextInfo!.onTextChange.dispose();
        _inputTextInfo = inputTextInfo as InputTextInfo;
      }
      if (!_inputTextInfo!.isListening!) {
        _initDatas();
        _inputTextInfo!.isListening = true;
      }
      if (_inputTextInfo!.text != _controller.text) {
        _controller.text = _inputTextInfo!.text;
      }
    } catch (e) {
      print(e);
    }
  }
}