// ignore_for_file: deprecated_member_use_from_same_package, use_build_context_synchronously

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:hoshan/core/gen/assets.gen.dart';
import 'package:hoshan/core/utils/strings.dart';
import 'package:hoshan/ui/theme/colors.dart';
import 'package:hoshan/ui/theme/text.dart';
import 'package:hoshan/ui/widgets/components/snackbar/snackbar_manager.dart';
import 'package:hoshan/ui/widgets/components/text/latex.dart';
import 'package:markdown_widget/markdown_widget.dart';
import 'package:flutter_highlight/themes/atom-one-dark-reasonable.dart';
import 'package:flutter_highlight/themes/atom-one-light.dart';

class DefaultMarkdownText extends StatefulWidget {
  final String text;
  final Color? color;
  final double? width;
  final bool fromBot;
  const DefaultMarkdownText(
      {super.key,
      required this.text,
      this.color,
      this.width,
      this.fromBot = false});

  @override
  State<DefaultMarkdownText> createState() => DefaultMarkdownTextState();
}

class DefaultMarkdownTextState extends State<DefaultMarkdownText> {
  late TextDirection textDirection =
      widget.text.startsWithEnglish() ? TextDirection.ltr : TextDirection.rtl;

  String changeDirection() {
    setState(() {
      if (textDirection == TextDirection.rtl) {
        textDirection = TextDirection.ltr;
      } else {
        textDirection = TextDirection.rtl;
      }
    });
    return textDirection.name.toUpperCase();
  }

  @override
  Widget build(BuildContext context) {
    final isDark = Theme.of(context).brightness == Brightness.dark;

    final config = isDark
        ? MarkdownConfig.darkConfig.copy(configs: [
            CodeConfig(
                style: MarkdownConfig.darkConfig.code.style.copyWith(
                    color: widget.color,
                    backgroundColor:
                        atomOneDarkReasonableTheme['root']!.backgroundColor)),
          ])
        : MarkdownConfig.defaultConfig;
    return Column(
      children: [
        Directionality(
          textDirection: textDirection,
          child: SizedBox(
            width: widget.width,
            child: MarkdownBlock(
              data: widget.text,
              selectable: true,
              generator: MarkdownGenerator(
                generators: [latexGenerator],
                inlineSyntaxList: [LatexSyntax()],
                // richTextBuilder: (span) => Text.rich(
                //   span,
                //   softWrap: true,
                //   style: config.p.textStyle.copyWith(
                //       fontFamily: AppTextStyles.defaultFontFamily,
                //       color: widget.color),
                // ),
              ),
              config: config.copy(configs: [
                PreConfig(
                  builder: (code, language) => Padding(
                    padding: const EdgeInsets.symmetric(vertical: 18.0),
                    child: Directionality(
                      textDirection: TextDirection.ltr,
                      child: ClipRRect(
                        borderRadius: BorderRadius.circular(8),
                        child: Column(
                          children: [
                            Container(
                              padding: const EdgeInsets.all(8),
                              decoration: BoxDecoration(
                                  color: isDark
                                      ? AppColors.black[900]
                                      : AppColors.primaryColor.defaultShade),
                              child: Row(
                                mainAxisAlignment:
                                    MainAxisAlignment.spaceBetween,
                                children: [
                                  Text(
                                    language,
                                    style: const TextStyle(
                                        color: Colors.white,
                                        fontWeight: FontWeight.bold,
                                        fontSize: 16),
                                  ),
                                  InkWell(
                                    onTap: () async {
                                      await Clipboard.setData(
                                          ClipboardData(text: code));
                                      if (mounted) {
                                        SnackBarManager(context, id: 'Copy')
                                            .show(
                                          status: SnackBarStatus.success,
                                          message: 'پیام با موفقیت کپی شد 😃',
                                        );
                                      }
                                    },
                                    child: Row(
                                      children: [
                                        const Text(
                                          'copy',
                                          style: TextStyle(
                                              color: Colors.white,
                                              fontSize: 14),
                                        ),
                                        const SizedBox(
                                          width: 4,
                                        ),
                                        Assets.icon.outline.copy
                                            .svg(color: Colors.white),
                                      ],
                                    ),
                                  )
                                ],
                              ),
                            ),
                            Container(
                              constraints: const BoxConstraints(
                                  minWidth: double.infinity),
                              child: HighlightView(
                                code,
                                language: language,
                                theme: isDark
                                    ? atomOneDarkReasonableTheme
                                    : atomOneLightTheme,
                                textStyle:
                                    TextStyle(color: widget.color, height: 1.4),
                                padding: const EdgeInsets.all(8),
                              ),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
                ),
                H1Config(
                    style: config.h1.style.copyWith(
                        fontSize: 22,
                        fontFamily: AppTextStyles.defaultFontFamily,
                        color: widget.color)),
                H2Config(
                    style: config.h2.style.copyWith(
                        fontSize: 21,
                        fontFamily: AppTextStyles.defaultFontFamily,
                        color: widget.color)),
                H3Config(
                    style: config.h3.style.copyWith(
                        fontSize: 20,
                        fontFamily: AppTextStyles.defaultFontFamily,
                        color: widget.color)),
                H4Config(
                    style: config.h4.style.copyWith(
                        fontSize: 19,
                        fontFamily: AppTextStyles.defaultFontFamily,
                        color: widget.color)),
                H5Config(
                    style: config.h5.style.copyWith(
                        fontSize: 18,
                        fontFamily: AppTextStyles.defaultFontFamily,
                        color: widget.color)),
                H6Config(
                    style: config.h6.style.copyWith(
                        fontSize: 17,
                        fontFamily: AppTextStyles.defaultFontFamily,
                        color: widget.color)),
                PConfig(
                  textStyle: config.p.textStyle.copyWith(
                      fontSize: 16,
                      fontFamily: AppTextStyles.defaultFontFamily,
                      color: widget.color),
                ),
              ]),
            ),
          ),
        ),
      ],
    );
  }
}
