import 'dart:convert';
import 'dart:typed_data';

import 'package:cashier_reserve/common/encrypt/pwd.dart';
import 'package:cashier_reserve/common/manager/app_manager.dart';
import 'package:cashier_reserve/common/print/print.dart';
import 'package:cashier_reserve/common/utils/utils.dart';
import 'package:cashier_reserve/model/login_model.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class LoginView extends StatefulWidget {
  const LoginView({super.key});

  @override
  State<StatefulWidget> createState() {
    return _LoginViewState();
  }
}

class _LoginViewState extends State<LoginView> {
  String loginType = "merchant";
  int segmentIndex = 0;

  TextEditingController merchantText = TextEditingController();
  TextEditingController accountText = TextEditingController();
  TextEditingController passwordText = TextEditingController();
  TextEditingController codeText = TextEditingController();

  String authCodeUuid = "";
  String authCodeImg = "";
  DateTime? lastPopTime;

  @override
  void initState() {
    super.initState();

    accountText.text = "13718478323";
    passwordText.text = "123456789";

    _loadAuthCode();
  }

  void _loadAuthCode() async {
    var res = await LoginModel.getLoginAuthCode();

    if (res is Map) {
      Map<String, dynamic> result = res as Map<String, dynamic>;
      setState(() {
        authCodeUuid = result["uuid"] ?? "";
        String img = result["img"] ?? "";
        if (img.startsWith("data:image/png;base64,")) {
          authCodeImg = img.substring("data:image/png;base64,".length);
        }
      });
    } else {
      yjPrint("获取验证码失败");
    }
  }

  void _goLogin() async {
    if (loginType == "staff") {
      if (merchantText.text.isEmpty) {
        Utils.toast("请输入商户号", context);
        return;
      }
    }

    if (accountText.text.isEmpty) {
      Utils.toast("请输入账号", context);
      return;
    }

    if (passwordText.text.isEmpty) {
      Utils.toast("请输入密码", context);
      return;
    }

    if (codeText.text.isEmpty) {
      Utils.toast("请输入验证码", context);
      return;
    }

    String pwd = PwdEncrypt.encrypt(passwordText.text);
    yjPrint("pwd === $pwd");

    var params = {
      "username": accountText.text,
      "password": pwd,
      "code": codeText.text,
      "uuid": authCodeUuid,
      "loginType": loginType,
    };

    if (loginType == "staff") {
      params["loginType"] = "staff";
      params["merchantName"] = merchantText.text;
    }

    final r = await LoginModel.login(params);
    if (r == null) {
      _loadAuthCode();
      return;
    }
    AppManager.loginSuccess(r);
  }

  @override
  void dispose() {
    merchantText.dispose();
    accountText.dispose();
    passwordText.dispose();
    codeText.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (didPop, result) async {
        // 点击返回键的操作
        if (lastPopTime == null ||
            DateTime.now().difference(lastPopTime!) > const Duration(seconds: 2)) {
          lastPopTime = DateTime.now();
          Utils.toast('再按一次退出', context);
        } else {
          lastPopTime = DateTime.now();
          // 退出app
          await SystemChannels.platform.invokeMethod('SystemNavigator.pop');
        }
      },
      child: Scaffold(
        backgroundColor: Colors.black.withOpacity(0.2),
        body: GestureDetector(
          onTap: () {
            FocusScope.of(context).requestFocus(FocusNode());
          },
          child: Container(
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height,
            color: const Color(0x55000000),
            child: Center(
              child: Container(
                padding: const EdgeInsets.fromLTRB(30, 30, 30, 30),
                decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(10),
                ),
                width: 400,
                // height: 400,
                child: SingleChildScrollView(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      _buildTitle(context),
                      const SizedBox(
                        height: 30,
                      ),
                      _buildSegment(context),
                      const SizedBox(
                        height: 5,
                      ),
                      _buildInputTextField(context, merchantText,
                          hintText: "请输入商户号",
                          icon: Icons.store_sharp,
                          isHidden: loginType == "merchant"),
                      _buildInputTextField(context, accountText,
                          hintText: "请输入账号", icon: Icons.people),
                      _buildInputTextField(context, passwordText,
                          hintText: "请输入密码",
                          icon: Icons.lock,
                          isPassword: true),
                      _buildInputTextField(context, codeText,
                          hintText: "请输入验证码",
                          icon: Icons.admin_panel_settings_sharp,
                          isCode: true),
                      _buildLoginBtn(context),
                    ],
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildLoginBtn(BuildContext context) {
    return InkWell(
      onTap: () {
        _goLogin();
      },
      child: Container(
        margin: const EdgeInsets.only(top: 25),
        height: 35,
        decoration: BoxDecoration(
          color: Colors.blue,
          borderRadius: BorderRadius.circular(5),
        ),
        child: const Center(
          child: Text(
            "登录",
            style: TextStyle(fontSize: 15, color: Colors.white),
          ),
        ),
      ),
    );
  }

  Widget _buildTitle(BuildContext context) {
    return const Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text(
          "银收客订餐系统",
          style: TextStyle(
              fontSize: 25,
              color: Color(0xff333333),
              decoration: TextDecoration.none),
        )
      ],
    );
  }

  Widget _buildSegment(BuildContext context) {
    return CupertinoSegmentedControl(
      //子标签
      children: {
        0: Container(
          width: 60,
          height: 30,
          alignment: Alignment.center,
          child: const Text(
            "商户",
            style: TextStyle(
                fontSize: 14,
                // color: Color(0xff333333),
                decoration: TextDecoration.none),
          ),
        ),
        1: Container(
          width: 60,
          height: 30,
          alignment: Alignment.center,
          child: const Text(
            "员工",
            style: TextStyle(
                fontSize: 14,
                // color: Color(0xff333333),
                decoration: TextDecoration.none),
          ),
        ),
      },
      //当前选中的索引
      groupValue: segmentIndex,
      //点击回调
      onValueChanged: (int index) {
        setState(() {
          segmentIndex = index;
          loginType = index == 0 ? "merchant" : "staff";
        });
      },
      selectedColor: Colors.blue,
      borderColor: Colors.blue,
      unselectedColor: Colors.white,
    );
  }

  Widget _buildInputTextField(
    BuildContext context,
    TextEditingController controller, {
    String hintText = "",
    IconData icon = Icons.people,
    bool isPassword = false,
    bool isHidden = false,
    bool isCode = false,
  }) {
    if (isHidden) {
      return Container();
    }
    return Column(
      children: [
        const SizedBox(
          height: 10,
        ),
        Row(
          children: [
            Expanded(
              child: Container(
                decoration: BoxDecoration(
                  border: Border.all(color: const Color(0xffefefef), width: 1),
                  borderRadius: BorderRadius.circular(5),
                ),
                padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
                height: 35,
                child: TextField(
                  controller: controller,
                  obscureText: isPassword,
                  decoration: InputDecoration(
                    icon: Icon(
                      icon,
                      color: const Color(0xffa6a6a6),
                    ),
                    hintText: hintText,
                    hintStyle: const TextStyle(
                      fontSize: 14,
                      color: Color(0xff999999),
                    ),
                    contentPadding: EdgeInsets.zero,
                    border: OutlineInputBorder(
                      borderSide: BorderSide.none,
                      borderRadius: BorderRadius.circular(5),
                    ),
                  ),
                ),
              ),
            ),
            if (isCode)
              InkWell(
                onTap: () {
                  _loadAuthCode();
                },
                child: Container(
                  margin: const EdgeInsets.only(left: 15),
                  width: 100,
                  height: 35,
                  child: (authCodeImg.isNotEmpty)
                      ? Image.memory(base64ToUint8List(authCodeImg))
                      : Container(),
                ),
              )
          ],
        ),
      ],
    );
  }

  Uint8List base64ToUint8List(String base64String) {
    const decoder = Base64Decoder();
    return decoder.convert(base64String);
  }
}
