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/inputText.dart';
import 'package:fis_lib_report/report_info/element_info.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();
  late final InputText inputText;
  final _controller = TextEditingController();
  final _focusNode = FocusNode();
  double? _lineWidth = 136.0;
  double? _fontSize = 22.0;
  double? _height = 22.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;

  @override
  initState() {
    inputText = widget.inputText;
    _isReadOnly = inputText.isReadOnly!;
    final inputTextInfo = ReportInfo.instance.getElementInfo(inputText);
    _inputTextInfo = inputTextInfo as InputTextInfo;
    if (inputText.isReadOnly!) {
      if (_inputTextInfo!.tag!.name == 'ReportPhysician') {
        _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!);
    }
    _textStyle = TextStyle(
      fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
      color: _fontColor,
    );
    //TODO(Loki):set FontName in TextField
    final fontName = inputText.fontName;
    //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
    final fontStyles = inputText.fontStyles;
    _lineLength = inputText.lineLength;
    _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);

    _textWrap = inputText.textWrap;
    _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
    _height = _fontSize! > 30 ? 43 : 22;

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

  @override
  Widget build(BuildContext context) {
    return Container(
      //constraints: BoxConstraints(minWidth: _lineWidth!, maxWidth: 480),
      width: _lineWidth,
      height: _textWrap! ? _height! * 4 : (_height!),
      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(
              inputText.verticalAlignment),
          minLines: 1,
          maxLines: _textWrap! ? 6 : 1,
          controller: _controller,
          textAlign: TextAlign.start,
          style: _textStyle,
          onChanged: (v) {
            //  _onInputChanged(_textStyle!, v);
          },
          onEditingComplete: () {
            _onInputChanged(_textStyle!, _controller.text);
          }),
    );
  }

  //onchange 事件
  void _onInputChanged(TextStyle _textStyle, String value) {
    if (_inputTextInfo != null) {
      _inputTextInfo!.text = value;
    }
    final width = TextSizeConvert.getTextSize(value, _textStyle).width + 15;
    //TODO(LOki):此处需要区分不同的输入框
    if (inputText.tag!.name == 'HospitalName') {
      if (_lineWidth! < width) {
        setState(() {
          if (width < 480) {
            _lineWidth = width;
          }
        });
      } else if (_controller.text.isEmpty) {
        setState(() {
          //重置长度
          _lineWidth = inputText.lineWidth;
        });
      } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle)
              .width >
          inputText.lineWidth!) {
        setState(() {
          if (width < 480) {
            _lineWidth = width;
          }
        });
      }
    }
  }

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