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

import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart';

import '../otp_widget.dart';

class SMSOTP {
  final type;

  final mobileNo;

  final Function onSuccess;

  final Function onFailure;

  final context;

  int remainingTime = 120;

  Future<Null> timer;

  static BuildContext _context;

  static bool _loading;

  SMSOTP(
    this.context,
    this.type,
    this.mobileNo,
    this.onSuccess,
    this.onFailure,
  );

  final verifyAccountForm = GlobalKey<FormState>();

  final TextEditingController _pinPutController = TextEditingController();

  TextEditingController digit1 = TextEditingController(text: "");

  TextEditingController digit2 = TextEditingController(text: "");

  TextEditingController digit3 = TextEditingController(text: "");

  TextEditingController digit4 = TextEditingController(text: "");

  Map verifyAccountFormValue = {
    'digit1': '',
    'digit2': '',
    'digit3': '',
    'digit4': '',
  };

  final focusD1 = FocusNode();

  final focusD2 = FocusNode();

  final focusD3 = FocusNode();

  final focusD4 = FocusNode();

  String errorMsg;

  ProjectViewModel projectProvider;

  String displayTime = '';

  String _code;

  dynamic setState;

  static String signature;

  displayDialog(BuildContext context) async {
    // var signature = await checkSignature();

    // print(signature);

    // if (signature) {

    //   onSuccess(signature);

    // }

    return showDialog(
        context: context,
        barrierColor: Colors.black.withOpacity(0.63),
        builder: (context) {
          projectProvider = Provider.of(context);

          return Dialog(
            backgroundColor: Colors.white,
            shape: RoundedRectangleBorder(),
            insetPadding: EdgeInsets.only(left: 21, right: 21),
            child: StatefulBuilder(builder: (context, setState) {
              if (displayTime == '') {
                startTimer(setState);

                // startLister();
                if (Platform.isAndroid) checkSignature();
              }

              return Container(
                padding: EdgeInsets.only(left: 21, right: 18, top: 39, bottom: 59),
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Row(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        SvgPicture.asset(
                          type == 1 ? "assets/images/new/verify_sms.svg" : "assets/images/new/verify_whatsapp.svg",
                          height: 50,
                          width: 50,
                        ),
                        IconButton(
                          padding: EdgeInsets.zero,
                          icon: Icon(Icons.close),
                          constraints: BoxConstraints(),
                          onPressed: () {
                            Navigator.pop(context);

                            this.onFailure();
                          },
                        )
                      ],
                    ),
                    SizedBox(height: 22),
                    Text(
                      TranslationBase.of(context).pleaseEnterTheVerificationCode + ' xxxxxxxx' + mobileNo.toString().substring(mobileNo.toString().length - 3),
                      style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48),
                    ),
                    SizedBox(height: 18),
                    Directionality(
                      textDirection: TextDirection.ltr,
                      child: Center(
                        child: OTPWidget(
                          autoFocus: true,
                          controller: _pinPutController,
                          defaultBorderColor: Color(0xffD8D8D8),
                          maxLength: 4,
                          onTextChanged: (text) {},
                          pinBoxColor: Colors.white,
                          onDone: (code) => _onOtpCallBack(code, null),
                          textBorderColor: Color(0xffD8D8D8),
                          pinBoxWidth: 60,
                          pinBoxHeight: 60,
                          pinTextStyle: TextStyle(
                            fontSize: 24.0,
                            color: Color(0xff2B353E),
                          ),
                          pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition,
                          pinTextAnimatedSwitcherDuration: Duration(milliseconds: 300),
                          pinBoxRadius: 10,
                          keyboardType: TextInputType.number,
                        ),
                      ),
                    ),
                    SizedBox(height: 30),
                    RichText(
                      text: TextSpan(
                        text: TranslationBase.of(context).validationMessage + '\n',
                        style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48),
                        children: <TextSpan>[
                          TextSpan(
                            text: displayTime,
                            style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xffD02127), letterSpacing: -0.48),
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              );
            }),
          );
        });
  }

  TextStyle buildTextStyle() {
    return TextStyle(
      fontSize: SizeConfig.textMultiplier * 3,
    );
  }

  InputDecoration buildInputDecoration(BuildContext context) {
    return InputDecoration(
      counterText: " ",

      // ts/images/password_icon.png

      // contentPadding: EdgeInsets.only(top: 20, bottom: 20),

      enabledBorder: OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(10)),
        borderSide: BorderSide(color: Colors.black),
      ),

      focusedBorder: OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(10.0)),
        borderSide: BorderSide(color: Theme.of(context).primaryColor),
      ),

      errorBorder: OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(10.0)),
        borderSide: BorderSide(color: Theme.of(context).errorColor),
      ),

      focusedErrorBorder: OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(10.0)),
        borderSide: BorderSide(color: Theme.of(context).errorColor),
      ),
    );
  }

  String validateCodeDigit(value) {
    if (value.isEmpty) {
      return ' ';
    } else if (value.length == 3) {
      print(value);
    } else {
      return null;
    }
  }

  checkValue() {
    //print(verifyAccountFormValue);

    if (verifyAccountForm.currentState.validate()) {
      onSuccess(digit1.text.toString() + digit2.text.toString() + digit3.text.toString() + digit4.text.toString());
    }
  }

  getSecondsAsDigitalClock(int inputSeconds) {
    var sec_num = int.parse(inputSeconds.toString()); // don't forget the second param

    var hours = (sec_num / 3600).floor();

    var minutes = ((sec_num - hours * 3600) / 60).floor();

    var seconds = sec_num - hours * 3600 - minutes * 60;

    var minutesString = "";

    var secondsString = "";

    minutesString = minutes < 10 ? "0" + minutes.toString() : minutes.toString();

    secondsString = seconds < 10 ? "0" + seconds.toString() : seconds.toString();

    return minutesString + ":" + secondsString;
  }

  startTimer(setState) {
    this.remainingTime--;

    setState(() {
      displayTime = this.getSecondsAsDigitalClock(this.remainingTime);
    });

    timer = Future.delayed(Duration(seconds: 1), () {
      if (this.remainingTime > 0) {
        startTimer(setState);
      } else {
        Navigator.pop(context);
      }
    });
  }

  static void hideSMSBox(context) {
    Navigator.pop(context);
  }

  _onOtpCallBack(String otpCode, bool isAutofill) {
    if (otpCode.length == 4) {
      onSuccess(otpCode);
    }
  }

  checkSignature() async {
    SmsVerification.startListeningSms().then((message) {
      // setState(() {
      final intRegex = RegExp(r'\d+', multiLine: true);
      var otp = SmsVerification.getCode(message, intRegex);
      _pinPutController.text = otp;
      onSuccess(otp);
      // });
    });
  }

  // startLister() {
  //   var signature = checkSignature();
  //
  //   print(signature);
  // }

  static getSignature() async {
    if (Platform.isAndroid) {
      return await SmsVerification.getAppSignature();
    } else {
      return null;
    }
  }
}
