import 'package:get/get.dart';
import 'package:kaer_with_panels/app/common/app_config.dart';
import 'package:kaer_with_panels/app/common/app_run_data.dart';
import 'package:kaer_with_panels/app/services/api_service/kr_api.user.dart';
import 'package:kaer_with_panels/app/utils/kr_common_util.dart';
import 'package:kaer_with_panels/app/localization/app_translations.dart';
import 'package:kaer_with_panels/app/routes/app_pages.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:kaer_with_panels/app/widgets/kr_app_text_style.dart';
import 'package:kaer_with_panels/app/modules/kr_main/controllers/kr_main_controller.dart';
import 'package:easy_refresh/easy_refresh.dart';

/// 邀请进度状态
class KRInviteProgress {
  final int pending;
  final int processing;
  final int success;
  final int expired;
  final int registers;
  final int totalCommission;

  KRInviteProgress({
    this.pending = 0,
    this.processing = 0,
    this.success = 0,
    this.expired = 0,
    this.registers = 0,
    this.totalCommission = 0,
  });
}

class KRInviteController extends GetxController {
  final kr_progress = KRInviteProgress(
    pending: 0,
    processing: 0,
    success: 0,
    expired: 0,
    registers: 0,
    totalCommission: 0,
  ).obs;
  final kr_referCode = ''.obs;
  final kr_isLoading = false.obs;
  final count = 0.obs;
  final EasyRefreshController refreshController = EasyRefreshController();

  @override
  void onInit() {
    super.onInit();
    ever(KRAppRunData.getInstance().kr_isLogin, (value) {
      if (value) {
        _kr_fetchUserInfo();
        _kr_fetchAffiliateCount();
      } else {
        kr_progress.value = KRInviteProgress(
          pending: 0,
          processing: 0,
          success: 0,
          expired: 0,
          registers: 0,
          totalCommission: 0,
        );
        kr_referCode.value = '';
      }
    });
    if (KRAppRunData.getInstance().kr_isLogin.value) {
      _kr_fetchUserInfo();
      _kr_fetchAffiliateCount();
    }
  }

  Future<void> _kr_fetchUserInfo() async {
    try {
      kr_isLoading.value = true;
      final either = await KRUserApi().kr_getUserInfo();
      either.fold(
        (error) => KRCommonUtil.kr_showToast(error.msg),
        (userInfo) {
          kr_referCode.value = userInfo.referCode;
        },
      );
    } catch (e) {
      KRCommonUtil.kr_showToast(e.toString());
    } finally {
      kr_isLoading.value = false;
    }
  }

  Future<bool> kr_checkLoginStatus() async {
    return KRAppRunData.getInstance().kr_isLogin.value;
  }

  /// 获取分享链接
  String kr_getShareLink() {
    if (kr_referCode.isEmpty) {
      return '';
    }
    return '${AppConfig.getInstance().kr_invitation_link}${kr_referCode.value}';
  }

  /// 获取二维码内容
  String kr_getQRCodeContent() {
    return kr_getShareLink();
  }

  /// 复制文本到剪贴板
  Future<void> _kr_copyToClipboard(String text) async {
    await Clipboard.setData(ClipboardData(text: text));
    KRCommonUtil.kr_showToast(AppTranslations.kr_invite.copiedToClipboard);
  }

  Future<void> kr_handleQRShare() async {
    if (!await kr_checkLoginStatus()) {
      Get.find<KRMainController>().kr_setPage(0);
      return;
    }

    if (kr_referCode.isEmpty) {
      await _kr_fetchUserInfo();
      if (kr_referCode.isEmpty) {
        KRCommonUtil.kr_showToast(AppTranslations.kr_invite.getInviteCodeFailed);
        return;
      }
    }

    final qrContent = kr_getQRCodeContent();
    if (qrContent.isEmpty) {
      KRCommonUtil.kr_showToast(AppTranslations.kr_invite.generateQRCodeFailed);
      return;
    }

    // 只有在登录状态下才弹出二维码对话框
    if (KRAppRunData.getInstance().kr_isLogin.value) {
      Get.dialog(
        Dialog(
          backgroundColor: Theme.of(Get.context!).cardColor,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(16.r),
          ),
          child: Container(
            padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 24.w),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Text(
                  AppTranslations.kr_invite.shareQR,
                  style: KrAppTextStyle(
                    fontSize: 17,
                    fontWeight: FontWeight.w600,
                    color: Theme.of(Get.context!).textTheme.titleMedium?.color,
                  ),
                ),
                SizedBox(height: 16.w),
                Container(
                  padding: EdgeInsets.all(16.w),
                  decoration: BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.circular(12.r),
                    border: Border.all(
                      color: Theme.of(Get.context!).dividerColor.withOpacity(0.1),
                    ),
                    boxShadow: [
                      BoxShadow(
                        color: Colors.black.withOpacity(0.05),
                        blurRadius: 10,
                        offset: Offset(0, 2),
                      ),
                    ],
                  ),
                  child: QrImageView(
                    data: qrContent,
                    version: QrVersions.auto,
                    size: 200.w,
                    backgroundColor: Colors.white,
                    foregroundColor: Colors.black,
                  ),
                ),
                SizedBox(height: 20.w),
                Container(
                  width: double.infinity,
                  height: 44.w,
                  child: TextButton(
                    onPressed: () => Get.back(),
                    style: TextButton.styleFrom(
                      backgroundColor: Theme.of(Get.context!).primaryColor.withOpacity(0.1),
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(22.r),
                      ),
                    ),
                    child: Text(
                      AppTranslations.kr_invite.close,
                      style: TextStyle(
                        color: Theme.of(Get.context!).textTheme.bodyMedium?.color,
                        fontSize: 16.sp,
                        fontWeight: FontWeight.w500,
                        fontFamily: 'AlibabaPuHuiTi-Regular',
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      );
    }
  }

  void kr_viewRewardDetails() {
    // TODO: 实现查看奖励明细功能
  }

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

  @override
  void onClose() {
    refreshController.dispose();
    super.onClose();
  }

  void increment() => count.value++;

  /// 处理链接分享
  Future<void> kr_handleLinkShare() async {
    if (!await kr_checkLoginStatus()) {
      Get.find<KRMainController>().kr_setPage(0);
      return;
    }

    if (kr_referCode.isEmpty) {
      await _kr_fetchUserInfo();
      if (kr_referCode.isEmpty) {
        KRCommonUtil.kr_showToast(AppTranslations.kr_invite.getInviteCodeFailed);
        return;
      }
    }

    final shareLink = kr_getShareLink();
    if (shareLink.isEmpty) {
      KRCommonUtil.kr_showToast(AppTranslations.kr_invite.generateShareLinkFailed);
      return;
    }

    await _kr_copyToClipboard(shareLink);
  }

  /// 处理复制邀请码
  Future<void> kr_handleCopyInviteCode() async {
    if (!await kr_checkLoginStatus()) {
      Get.find<KRMainController>().kr_setPage(0);
      return;
    }

    if (kr_referCode.isEmpty) {
      await _kr_fetchUserInfo();
      if (kr_referCode.isEmpty) {
        KRCommonUtil.kr_showToast(AppTranslations.kr_invite.getInviteCodeFailed);
        return;
      }
    }

    await _kr_copyToClipboard(kr_referCode.value);
  }

  /// 获取邀请统计信息
  Future<void> _kr_fetchAffiliateCount() async {
    try {
      final either = await KRUserApi().kr_getAffiliateCount();
      either.fold(
        (error) => KRCommonUtil.kr_showToast(error.msg),
        (affiliateCount) {
          kr_progress.value = KRInviteProgress(
            pending: kr_progress.value.pending,
            processing: kr_progress.value.processing,
            success: kr_progress.value.success,
            expired: kr_progress.value.expired,
            registers: affiliateCount.registers,
            totalCommission: affiliateCount.totalCommission,
          );
        },
      );
    } catch (e) {
      KRCommonUtil.kr_showToast(e.toString());
    }
  }

  Future<void> kr_onRefresh() async {
    if (!KRAppRunData.getInstance().kr_isLogin.value) {
      refreshController.finishRefresh();
      return;
    }
    
    try {
      await _kr_fetchUserInfo();
      await _kr_fetchAffiliateCount();
    } finally {
      refreshController.finishRefresh();
    }
  }
}

