import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:eitc_erm_app/register.dart';
import 'package:eitc_erm_app/utils/Component.dart';
import 'package:eitc_erm_app/utils/Constants.dart';
import 'package:eitc_erm_app/utils/Utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:http/http.dart' as http;

import 'bean/login_entity.dart';
import 'bean/normal_response.dart';
import 'bottom_navigation.dart';
import 'call_platform.dart';
import 'doctor_talk_list.dart';
import 'home.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(Login());
}

class Login extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => LoginState();
}

class LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(title: Text('登录'), centerTitle: true),
      body: Center(
        child: MyBody(),
      ),
    ));
  }
}

class MyBody extends StatefulWidget {
  @override
  _MyBodyState createState() => _MyBodyState();
}

class _MyBodyState extends State<MyBody> {
  bool isButtonEnable = true; //按钮状态 是否可点击
  String buttonText = '发送验证码'; //初始文本
  int count = 60; //初始倒计时时间
  late Timer timer; //倒计时的计时器
  TextEditingController mController = TextEditingController();
  TextEditingController phoneController = TextEditingController();
  bool isPasswordLogin = false;
  String passText = "验证码";
  String loginText = "密码登录";
  String hintText = "请输入验证码";
  int patientOrDoctor = 1;

  void _buttonClickListen() {
    if (!Utils.isChinaPhoneLegal(phoneController.text)) {
      Component.toast("请输入正确手机号码！", 0);
      return null;
    }
    setState(() {
      sendCaptchaCode();
      if (isButtonEnable) {
        isButtonEnable = false; //按钮状态标记
        _initTimer();
        return null; //返回null按钮禁止点击
      } else {
        return null; //返回null按钮禁止点击
      }
    });
  }

  void _initTimer() {
    timer = Timer.periodic(const Duration(seconds: 1), (Timer timer) {
      count--;
      setState(() {
        if (count == 0) {
          timer.cancel(); //倒计时结束取消定时器
          isButtonEnable = true; //按钮可点击
          count = 60; //重置时间
          buttonText = '发送验证码'; //重置按钮文本
        } else {
          buttonText = '重新发送($count)'; //更新文本内容
        }
      });
    });
  }

  @override
  void dispose() {
    timer?.cancel(); //销毁计时器
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Container(
        padding: const EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0),
        child: Column(
          children: <Widget>[
            Container(
              color: Colors.white,
              padding: const EdgeInsets.only(left: 10, right: 10),
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.fromLTRB(0, 80, 0, 80),
                    child: Center(
                      child: Image(
                        image: AssetImage('assets/images/logo.png'),
                      ),
                    ),
                  ),
                  const Row(
                    children: [
                      Text(
                        '未注册的手机号验证后自动创建您的账号',
                        style: TextStyle(color: Colors.blue, fontSize: 15),
                        textAlign: TextAlign.left,
                        overflow: TextOverflow.ellipsis,
                      ),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    crossAxisAlignment: CrossAxisAlignment.baseline,
                    textBaseline: TextBaseline.alphabetic,
                    children: <Widget>[
                      const Text(
                        '+86',
                        style:
                            TextStyle(fontSize: 13, color: Color(0xff333333)),
                      ),
                      Expanded(
                        child: Padding(
                          padding: const EdgeInsets.only(
                              left: 20, right: 15, top: 5),
                          child: TextFormField(
                            maxLines: 1,
                            onSaved: (value) {},
                            controller: phoneController,
                            textAlign: TextAlign.left,
                            inputFormatters: [
                              FilteringTextInputFormatter.digitsOnly,
                              LengthLimitingTextInputFormatter(11)
                            ],
                            decoration: const InputDecoration(
                              hintText: ('请填写手机号'),
                              hintStyle: TextStyle(
                                color: Color(0xff999999),
                                fontSize: 13,
                              ),
                              alignLabelWithHint: true,
                              border: OutlineInputBorder(
                                  borderSide: BorderSide.none),
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    crossAxisAlignment: CrossAxisAlignment.baseline,
                    textBaseline: TextBaseline.alphabetic,
                    children: <Widget>[
                      Text(
                        passText,
                        style:
                            TextStyle(fontSize: 13, color: Color(0xff333333)),
                      ),
                      Expanded(
                        child: Padding(
                          padding: EdgeInsets.only(left: 15, right: 15, top: 0),
                          child: TextFormField(
                            maxLines: 1,
                            onSaved: (value) {},
                            controller: mController,
                            textAlign: TextAlign.left,
                            /*inputFormatters: [
                            FilteringTextInputFormatter.digitsOnly,
                            LengthLimitingTextInputFormatter(6)
                          ],*/
                            decoration: InputDecoration(
                              hintText: (hintText),
                              contentPadding:
                                  EdgeInsets.only(top: -5, bottom: 0),
                              hintStyle: TextStyle(
                                color: Color(0xff999999),
                                fontSize: 13,
                              ),
                              alignLabelWithHint: true,
                              border: OutlineInputBorder(
                                  borderSide: BorderSide.none),
                            ),
                          ),
                        ),
                      ),
                      Container(
                        padding: const EdgeInsets.all(0),
                        width: 120,
                        child: Visibility(
                          visible: !isPasswordLogin,
                          child: ElevatedButton(
                            style: ButtonStyle(
                              backgroundColor:
                                  MaterialStateProperty.resolveWith<Color>(
                                      (states) {
                                if (states.contains(MaterialState.disabled)) {
                                  return Colors.brown; // Disabled color
                                }
                                return Colors.blue; // Regular color
                              }),
                              foregroundColor: MaterialStateProperty.all(
                                  isButtonEnable
                                      ? Colors.white
                                      : Colors.black.withOpacity(0.2)),
                            ),
                            // backgroundColor  : isButtonEnable
                            //     ? Color(0xff44c5fe)
                            //     : Colors.grey.withOpacity(0.1), //按钮的颜色
                            // splashColor: isButtonEnable
                            //     ? Colors.white.withOpacity(0.1)
                            //     : Colors.transparent,
                            // shape: StadiumBorder(side: BorderSide.none),
                            onPressed: () {
                              if(isButtonEnable)
                              setState(() {
                                _buttonClickListen();
                              });
                            },
                            child: Text(
                              '$buttonText',
                              style: TextStyle(
                                fontSize: 12,
                              ),
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
            Container(
              width: double.infinity,
              height: 45,
              margin: EdgeInsets.only(top: 30, left: 10, right: 10),
              child: ElevatedButton(
                style: ButtonStyle(
                  backgroundColor:
                      MaterialStateProperty.resolveWith<Color>((states) {
                    return Colors.blue; // Regular color
                  }),
                ),
                onPressed: () {
                  debugPrint(
                      '手机号：${phoneController.text}，验证码：${mController.text}');
                  login();
                },
                // shape: StadiumBorder(side: BorderSide.none),
                // color: Color(0xff44c5fe),
                child: Text(
                  '登录',
                  style: TextStyle(color: Colors.white, fontSize: 15),
                ),
              ),
            ),
            Padding(
              padding: EdgeInsets.all(20),
              child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Row(
                      children: <Widget>[
                        Text("患者"),
                        Radio(
                          value: 1,
                          onChanged: (value) {
                            setState(() {
                              this.patientOrDoctor = value!;
                            });
                          },
                          groupValue: patientOrDoctor,
                        ),
                        SizedBox(
                          width: 20,
                        ),
                        Text("医生"),
                        Radio(
                          value: 2,
                          onChanged: (value) {
                            setState(() {
                              this.patientOrDoctor = value!;
                            });
                          },
                          groupValue: patientOrDoctor,
                        ),
                      ],
                    ),
                    GestureDetector(
                      onTap: () {
                        // launchAndroid();
                        isPasswordLogin = !isPasswordLogin;
                        print(isPasswordLogin);
                        setState(() {
                          if (isPasswordLogin) {
                            passText = "密    码";
                            loginText = "验证码登录";
                            hintText = "请输入密码";
                          } else {
                            passText = "验证码";
                            loginText = "密码登录";
                            hintText = "请输入验证码";
                          }
                        });
                      },
                      child: Text(
                        loginText,
                        style: TextStyle(color: Colors.blue, fontSize: 15),
                        textAlign: TextAlign.right,
                      ),
                    ),
                  ]),
            )
          ],
        ),
      ),
    );
  }

  Future<void> launchAndroid() async {
    const platform = MethodChannel('com.example.xcx_dashan_app/channel');
    try {
      var result = await platform.invokeMethod('launchApp');

      //  var result = await platform.invokeMethod('launchAppOne',{'param1': "这是一个参数"});
      // var result =  await platform.invokeMethod('launchAppOne',{'param1': "这是一个参数",'param2': "这是一个参数"});
      print("结果$result");
    } on PlatformException catch (e) {
      print("Failed to invoke method: '${e.message}'.");
    }
  }

  String tmpPhone = "";
  String tmpCode = "";
  Future<String?> sendCaptchaCode() async {
    tmpPhone = phoneController.text;
    var params = {
      'phoneNumber': phoneController.text,
    };
    var response = await http
        .post(Uri.parse(Global.BaseUrl + 'sendCaptchaCode'), body: params);

    if (response.statusCode == 200) {
      final jsonString = utf8.decode(response.bodyBytes);
      final jsonResponse = jsonDecode(jsonString);
      print(jsonResponse);
      NormalResponse mNormalResponse =
          new NormalResponse.fromJson(jsonResponse);
      if (mNormalResponse.code == Global.responseSuccessCode) {
        Component.toast("短信发送成功，请查收！", 2);
        tmpCode = mNormalResponse.data.toString();
      } else {
        Component.toast(mNormalResponse.msg.toString(), 0);
      }
      return response.toString();
    } else {
      Component.toast("出错了，请稍后再试！", 0);
      return null;
    }
  }

  Future<String?> login() async {
    if (!Utils.isChinaPhoneLegal(phoneController.text)) {
      Component.toast("请输入正确手机号码！", 0);
      return null;
    }

    if (!isPasswordLogin && !Utils.isVerifyCode(mController.text)) {
      Component.toast("请输入正确验证码！", 0);
      return null;
    }
    if (!isPasswordLogin && (!(phoneController.text == tmpPhone) || !(mController.text == tmpCode))) {
      Component.toast("手机号与验证码不匹配！", 0);
      return null;
    }
    var params;
    if (isPasswordLogin) {
      params = {
        'phoneNumber': phoneController.text,
        'password': mController.text,
        'type': patientOrDoctor,
      };
    } else {
      params = {
        'phoneNumber': phoneController.text,
        'captchaCode': mController.text,
        'type': patientOrDoctor,
      };
    }

    Map<String, String> headers = {
      HttpHeaders.contentTypeHeader: "application/json; charset=utf-8",
    };

    String url = 'captcha/login';
    if (isPasswordLogin) {
      url = 'password/login';
    }

    var response = await http.post(Uri.parse(Global.BaseUrl + url),
        body: jsonEncode(params), headers: headers);
    print(response.body.toString());
    if (response.statusCode == 200) {
      final jsonString = utf8.decode(response.bodyBytes);
      final jsonResponse = jsonDecode(jsonString);
      print(jsonString);
      LoginEntity mLoginEntity = new LoginEntity.fromJson(jsonResponse);
      if (mLoginEntity.code == Global.responseSuccessCode) {
        Component.toast("登录成功！", 2);
        Global.loginPhoneNo = phoneController.text;
        Global.token = mLoginEntity.data!.token!;
        Global.user = mLoginEntity;
        if(patientOrDoctor == 2) {
          Utils.saveData("doctorToken", Global.token);
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => DoctorTalkList()),
          );
        }
        else {
          Utils.saveData("token", Global.token);
          Utils.saveData("userId", Global.user.data!.id.toString());
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => BottomNavigationWidget()),
          );
        }

      } else {
        Component.toast(mLoginEntity.msg.toString(), 0);
        if (mLoginEntity.msg.toString().contains("用户不存在") && patientOrDoctor == 1) {
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => Register()),
          );
        }
      }

      return response.toString();
    } else {
      Component.toast("出错了，请稍后再试！", 0);
      return null;
    }
  }

  Future<void> _showDialogWithList(BuildContext context) async {
    return showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('选择一个选项'),
          content: ListView(
            shrinkWrap: true,
            children: <Widget>[
              ListTile(
                title: Text('选项 1'),
                onTap: () {
                  Navigator.of(context).pop();
                },
              ),
              ListTile(
                title: Text('选项 2'),
                onTap: () {
                  Navigator.of(context).pop();
                },
              ),
              // 可以根据需要添加更多的列表项
            ],
          ),
        );
      },
    );
  }
}
