enum DocumentTextType { normal, linkText }

typedef DocumentTextLinkData = ({String text, String? url, DocumentTextType type});

/// Automatically detects and parses strings with hypertext in a markdown format
class DocumentText {
  DocumentText({required this.content});

  final String content;
  static final _markdownLinkRegex = RegExp(r'\[(.*?)\]\((.*?)\)');

  bool get hasLinkMarkup => _markdownLinkRegex.hasMatch(content);

  List<DocumentTextLinkData> toTextLinkList() {
    final markdownLinkRegex = RegExp(r'\[(.*?)\]\((.*?)\)');
    if (markdownLinkRegex.hasMatch(content)) {
      final matches = markdownLinkRegex.allMatches(content).toList();
      final List<DocumentTextLinkData> stringSections = [];
      int prevStartIndex = 0;
      while (matches.isNotEmpty) {
        final match = matches.removeAt(0);
        stringSections
            .add((text: content.substring(prevStartIndex, match.start), url: null, type: DocumentTextType.normal));
        stringSections.add((text: match.group(1)!, url: match.group(2), type: DocumentTextType.linkText));
        prevStartIndex = match.end;
      }
      stringSections
          .add((text: content.substring(prevStartIndex, content.length), url: null, type: DocumentTextType.normal));
      return stringSections;
    } else {
      return [(text: content, url: null, type: DocumentTextType.normal)];
      // return Text("${bulletString != null ? '$bulletString ' : ''}$content", style: style);
    }
  }

  @override
  int get hashCode {
    return Object.hashAll([content]);
  }

  @override
  bool operator ==(Object other) {
    return super.hashCode == other.hashCode;
  }
}