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

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/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

import 'agreement.dart';
import 'bean/normal_response.dart';
import 'bottom_navigation.dart';
import 'home.dart';

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

class Register extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => RegisterState();
}

class RegisterState extends State<Register> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: new AppBar(
            title: new Text('注册',
                style: TextStyle(
                  color: Colors.white,
                )),
            centerTitle: true,
            elevation: 0.5,
            backgroundColor: Global.StatusBarColor,
            leading: new IconButton(
              tooltip: '返回上一页',
              icon: const Icon(
                Icons.arrow_back_ios,
                color: Colors.white,
              ),
              onPressed: () {
                Navigator.of(context).pop();
                //_nextPage(-1);
              },
            ),
          ),
          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();
  TextEditingController identificationCardController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  bool isPasswordLogin = false;
  String passText = "验证码";
  String loginText = "密码登录";
  String hintText = "请输入验证码";
  bool _isChecked = false;

  void _buttonClickListen() {
    setState(() {
      if (!Utils.isChinaPhoneLegal(phoneController.text)) {
        Component.toast("请输入正确手机号码！", 0);
        return null;
      }
      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)'; //更新文本内容
        }
      });
    });
  }

  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;
    }
  }

  @override
  void dispose() {
    timer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return 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>[
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  crossAxisAlignment: CrossAxisAlignment.baseline,
                  textBaseline: TextBaseline.alphabetic,
                  children: <Widget>[
                    const Text(
                      '身份证',
                      style: TextStyle(fontSize: 13, color: Color(0xff333333)),
                    ),
                    Expanded(
                      child: Padding(
                        padding:
                        const EdgeInsets.only(left: 5, right: 15, top: 5),
                        child: TextFormField(
                          maxLines: 1,
                          onSaved: (value) {},
                          controller: identificationCardController,
                          textAlign: TextAlign.left,
                          inputFormatters: [
                            FilteringTextInputFormatter.digitsOnly,
                            LengthLimitingTextInputFormatter(18)
                          ],
                          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>[
                    const Text(
                      '密码',
                      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: passwordController,
                          textAlign: TextAlign.left,
                          inputFormatters: [
                            FilteringTextInputFormatter.digitsOnly,
                            LengthLimitingTextInputFormatter(20)
                          ],
                          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>[
                    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: const InputDecoration(
                            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;
                                  }
                                  return Colors.blue;
                                }),
                            foregroundColor: MaterialStateProperty.all(
                                isButtonEnable
                                    ? Colors.white
                                    : Colors.black.withOpacity(0.2)),
                          ),
                          onPressed: () {
                            setState(() {
                              _buttonClickListen();
                            });
                          },
                          child: Text(
                            '$buttonText',
                            style: TextStyle(
                              fontSize: 12,
                            ),
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
            Padding(
              padding: EdgeInsets.only(top: 20, bottom: 0),
              child: Row(
                  mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                SizedBox(
                  width: 20.0,
                  height: 20.0,
                  child: Checkbox(
                    value: _isChecked,
                    onChanged: (bool? newValue) {
                      setState(() {
                        _isChecked = newValue ?? false;
                      });
                    },
                    activeColor: Colors.green, // 选中时的颜色
                    checkColor: Colors.white, // 选中标记的颜色
                  ),
                ),

                Text(
                  "  同意",
                  style: TextStyle(fontSize: 13, color: Color(0xff333333)),
                ),
                GestureDetector(
                  onTap: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => Agreement()),
                    );
                  },
                  child: Text(
                    "口腔医院相关服务协议及隐私政策",
                    style: const TextStyle(
                        fontSize: 14,
                        color: Colors.blueAccent),
                  ),
                ),
              ]))
              ],
            ),
          ),
          Container(
            width: double.infinity,
            height: 45,
            margin: EdgeInsets.only(top: 20, left: 10, right: 10),
            child: ElevatedButton(
              style: ButtonStyle(
                backgroundColor:
                MaterialStateProperty.resolveWith<Color>((states) {
                  return Colors.blue; // Regular color
                }),
              ),
              onPressed: () {
                debugPrint(
                    '手机号：${phoneController.text}，验证码：${mController.text}');
                register();
              },
              child: Text(
                '注册',
                style: TextStyle(color: Colors.white, fontSize: 15),
              ),
            ),
          ),
        ],
      ),
    );
  }

  void _showDialog() {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('提示'),
          content: Text('请您阅读《口腔医院相关服务协议及隐私政策》并勾选同意'),
          actions: <Widget>[
            ElevatedButton(
              child: Text("确定",
                  style: TextStyle(
                      color: Colors.white, fontSize: 13)),
              style: ButtonStyle(
                backgroundColor:
                MaterialStateProperty.resolveWith<Color>(
                        (states) {
                      return Colors
                          .lightBlueAccent; // Regular color
                    }),
                // fixedSize: MaterialStateProperty.all<Size>(
                //   Size(70, 15),
                // ),
                padding: MaterialStateProperty.all(
                    EdgeInsets.zero),
              ),
              onPressed: () {Navigator.of(context).pop();},
            ),
          ],
        );
      },
    );
  }

  Future<String?> register() async {
    if(phoneController.text.length < 11) {
      Component.toast("请正确填写电话号码！", 0);
      return null;
    } else if(mController.text.length < 6) {
      Component.toast("请正确填写验证码！", 0);
      return null;
    } else if(!Utils.validateIDCard(identificationCardController.text)) {
      Component.toast("请正确填写身份证号码！", 0);
      return null;
    } else if(passwordController.text.length < 6) {
      Component.toast("请正确填写密码！", 0);
      return null;
    } else if (!Utils.isChinaPhoneLegal(phoneController.text)) {
      Component.toast("请输入正确手机号码！", 0);
      return null;
    } else if (!Utils.isVerifyCode(mController.text)) {
      Component.toast("请输入正确验证码！", 0);
      return null;
    } else if (!(phoneController.text == tmpPhone) || !(mController.text == tmpCode)) {
      Component.toast("手机号与验证码不匹配！", 0);
      return null;
    }
    if(!_isChecked) {
      _showDialog();
      return null;
    }
    var params = {
        'phoneNumber': phoneController.text,
        'captchaCode': mController.text,
        'identificationCard': identificationCardController.text,
        'password': passwordController.text,
      };

    Map<String, String> headers = {
      HttpHeaders.contentTypeHeader: "application/json; charset=utf-8",
    };
    var response = await http.post(Uri.parse(Global.BaseUrl + 'register'),
        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);
      NormalResponse mNormalResponse =
      new NormalResponse.fromJson(jsonResponse);
      if (mNormalResponse.code == Global.responseSuccessCode) {
        Component.toast("注册成功！", 2);
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => BottomNavigationWidget()),
        );
      } else {
        Component.toast(mNormalResponse.msg.toString(), 0);
      }
      return response.toString();
    } else {
      Component.toast("出错了，请稍后再试！", 0);
      return null;
    }
  }
}