import 'dart:convert';

import 'package:get/get.dart';
import 'package:kaer_with_panels/app/common/app_run_data.dart';
import 'package:kaer_with_panels/app/mixins/kr_app_bar_opacity_mixin.dart';
import 'package:kaer_with_panels/app/model/entity_from_json_util.dart';

import '../utils/kr_aes_util.dart';

/// 接口返回基础类
class BaseResponse<T> {
  late int retCode; //状态码
  late String retMsg; //返回的信息
  late Map<String, dynamic> body; // 返回的数据
  late T model;
  List<T> list = []; // 初始化为空列表
  bool isSuccess = true; // 是否返回正确数据

  BaseResponse.fromJson(Map<String, dynamic> json) {
    retCode = json['code'];
    final aes = AESUtils();
    final dataMap = json['data'] ?? Map<String, dynamic>();
    final cipherText = dataMap['data'] ?? "";

    final nonce = dataMap['time'] ?? "";
    if (cipherText.isNotEmpty  && nonce.isNotEmpty) {
      final encrypted = aes.decryptData(cipherText, "ne6t2qcz-szoa-rw78-egqz-lrsxxbl0dke3", nonce);
      body = jsonDecode(encrypted);
      
    }
    else
    {
      body = dataMap;
    }
    if (retCode == 40004 || retCode == 40005 || retCode == 40002 || retCode == 40003) {
      KRAppRunData().kr_loginOut();
    }

    if (retCode != 200) {
      isSuccess = false;
    }
    retMsg = json['msg'];

    // 获取错误信息
    final msg = "error.${retCode.toString()}".tr;

    if (msg.isNotEmpty && msg != "error.${retCode.toString()}") {
      retMsg = msg;
    }

   

    if (body.isNotEmpty) {
      if (body is List) {
        list = (json['data'] as List<dynamic>)
            .map((e) => EntityFromJsonUtil.parseJsonToEntity<T>(e))
            .toList();
      } else {
        if (T == dynamic) {
          model = body as T;
        } else {
          model = EntityFromJsonUtil.parseJsonToEntity<T>(body);
        }
      }
    } else {
      // 当body为空时，设置默认model值
    }
  }

  // 获取泛型T的默认值
  T _getDefaultValue<T>() {
    if (T == String) return '' as T;
    if (T == int) return 0 as T;
    if (T == double) return 0.0 as T;
    if (T == bool) return false as T;
    if (T == Map) return {} as T;
    if (T == List) return [] as T;
    return null as T;
  }
}
