import 'dart:async';
import 'package:flutter/material.dart';
import 'package:electronic_assistant/base/base_controller.dart';
import 'package:electronic_assistant/module/talk/mindmap/mind_util.dart';
import 'package:electronic_assistant/resource/assets.gen.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../../data/bean/talks.dart';
import '../../../data/bean/template_bean.dart';
import '../controller.dart';

class MindMapController extends BaseController {
  final String? talkId;

  MindMapController(this.talkId);

  TalkController get talkController => Get.find<TalkController>(tag: talkId);

  List<TemplateBean>? get templateList => talkController.templateList.value;

  int? get templateSelectId => talkController.templateSelectId.value;

  RxBool get isShowMindFullScreen => talkController.isShowMindFullScreen;

  StreamSubscription? _talkSummaryListener;
  StreamSubscription? _talkStatusListener;

  GlobalKey repaintKey = GlobalKey();

  bool _isWebViewLoaded = false;

  @override
  void onReady() async {
    super.onReady();

    _talkStatusListener =
        talkController.talkBean.value?.status.listen((status) {
      if (status == TalkStatus.analysisSuccess) {
        _dealTalkSummaryUpdate(talkController.talkBean.value?.summary.value);
      }
    });
    _dealTalkSummaryUpdate(talkController.talkBean.value?.summary.value);
    _talkSummaryListener =
        talkController.talkBean.value?.summary.listen((summary) {
      _dealTalkSummaryUpdate(summary);
    });
  }

  void _loadWebMindData(String summary) {
    talkController.webViewController.loadFlutterAsset(Assets.html.index);
    talkController.webViewController.setNavigationDelegate(
      NavigationDelegate(
        onPageFinished: (String url) async {
          _isWebViewLoaded = true;
          _callUpdateMind(summary);
        },
        onNavigationRequest: (NavigationRequest request) {
          return NavigationDecision.navigate;
        },
      ),
    );
  }

  void _callUpdateMind(String summary) {
    talkController.webViewController
        .callHandler(MindUtil.functionToJsUpdateMind, args: [summary],
            handler: (value) {
      debugPrint('_dealTalkSummaryUpdate mindMap update success: $value');
    });
  }

  void _updateMindData(String summary) {
    if (_isWebViewLoaded) {
      _callUpdateMind(summary);
    } else {
      _loadWebMindData(summary);
    }
  }

  void _dealTalkSummaryUpdate(String? summary) {
    if (summary == null ||
        summary.isEmpty ||
        talkController.talkBean.value?.status.value !=
            TalkStatus.analysisSuccess) {
      return;
    }
    _updateMindData(summary);
  }

  void fullScreenClick() {
    talkController.isShowMindFullScreen.value = true;
  }

  void exitFullScreenClick() {
    talkController.onExitMindFullScreen();
  }

  void selectTemplate(TemplateBean bean) {
    talkController.selectTemplate(bean);
  }

  @override
  void onClose() {
    super.onClose();
    _talkStatusListener?.cancel();
    _talkSummaryListener?.cancel();
  }
}
