import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:healthcare_pharmacy/google_maps_place_picker_mb/google_maps_place_picker.dart';
import 'package:healthcare_pharmacy/keys.dart';
import 'package:healthcare_pharmacy/otpscreen.dart';
import 'package:healthcare_pharmacy/settings.dart';
import 'login.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geocoding/geocoding.dart';
import 'package:image_picker/image_picker.dart';
import 'package:flutter/services.dart';
import 'dart:io' show File, Platform;
import 'package:google_maps_flutter_android/google_maps_flutter_android.dart';
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
import 'package:location/location.dart' as locationmap;




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

  @override
  State<SignUp> createState() => _SignUpState();
}

class _SignUpState extends State<SignUp> {
  bool isPwdObscureText=true;
  bool isConfirmPwdObscureText = true;
  TextEditingController nameController = TextEditingController();
  TextEditingController healthpharmaid = TextEditingController();
  TextEditingController buildingNameController = TextEditingController();
  TextEditingController pharmaRegController = TextEditingController();
  TextEditingController pharmaOpentimeController = TextEditingController();
  TextEditingController pharmaClosetimeController = TextEditingController();
  TextEditingController emailController = TextEditingController();
  TextEditingController mobileNumberController = TextEditingController();
  TextEditingController userAddressDescriptionController = TextEditingController();
  TextEditingController userAddressCapturingController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  TextEditingController confirmPasswordController = TextEditingController();


  String _currentAddress ='';
  Position? _currentPosition;
  String address1 = '';
  String address2 = '';
  String city = '';
  String state = '';
  String zip = '';
  String country = '';
  double lat=0;
  double lng=0;
  String dropdownTypeOfPlans = 'Red';
  var typeOfCategoryPlans = [
    'Red',
    'Blue',
    'Green',
  ];





  @override
  void initState() {
    isPwdObscureText = true;
    isConfirmPwdObscureText = true;
    super.initState();
  }





  PickResult? selectedPlace;

  bool _mapsInitialized = false;
  final String _mapsRenderer = "latest";

  var kInitialPosition = const LatLng(15.462477, 78.717401);

  locationmap.Location location = locationmap.Location();

  final GoogleMapsFlutterPlatform mapsImplementation =
      GoogleMapsFlutterPlatform.instance;

  void initRenderer() {
    if (_mapsInitialized) return;
    if (mapsImplementation is GoogleMapsFlutterAndroid) {
      switch (_mapsRenderer) {
        case "legacy":
          (mapsImplementation as GoogleMapsFlutterAndroid)
              .initializeWithRenderer(AndroidMapRenderer.legacy);
          break;
        case "latest":
          (mapsImplementation as GoogleMapsFlutterAndroid)
              .initializeWithRenderer(AndroidMapRenderer.latest);
          break;
      }
    }
    setState(() {
      _mapsInitialized = true;
    });
  }


  Future<bool> onWillPop() async {
    final shouldPop = await showDialog<bool>(context: context, builder: (context) {
      return AlertDialog(
        title: const Text('Do you want to exit app?',
            style: TextStyle(
              color: primaryColor,
              fontSize: 20,
            )),
        actionsAlignment: MainAxisAlignment.spaceBetween,
        actions: [
          TextButton(
            onPressed: () {
              SystemNavigator.pop();
            },
            child: const Text('Yes',
                style: TextStyle(
                  color: primaryColor,
                  fontSize: 20,
                )),
          ),
          TextButton(
            onPressed: () {
              Navigator.of(context).pop(false);
            },
            child: const Text('No',
                style: TextStyle(
                  color: primaryColor,
                  fontSize: 20,
                )),
          ),
        ],
      );
    },
    );
    return shouldPop!;
  }




  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop:()async=>onWillPop(),
      child: Scaffold(
          body: Stack(children: <Widget>[
            Container(
              decoration:  const BoxDecoration(
                image:  DecorationImage(image:  AssetImage("images/background.png"), fit: BoxFit.cover,),
              ),
            ),
            GestureDetector(
              onTap: () {
                FocusManager.instance.primaryFocus?.unfocus();
              },
              child: SafeArea(
                  child: SingleChildScrollView(
                    child: Column(
                      children: <Widget>[

                        SizedBox(
                          height: 20,
                        ),
                        Container(
                          //width: double.infinity,
                            child: Image(
                              image: const AssetImage('images/logo.png'),
                              height: MediaQuery.of(context).size.height * .18,
                            )),
                        SizedBox(
                          height: 10,
                        ),
                        Container(
                          padding: const EdgeInsets.all(10), // Set the desired width

                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: nameController,
                            textCapitalization: TextCapitalization.characters,
                            decoration: textFormFieldDecoration(Icons.person,'Enter Your Name'),
                          ),
                        ), //name

                        Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: pharmaRegController,
                            textCapitalization: TextCapitalization.characters,
                            decoration: textFormFieldDecoration(Icons.numbers,'Enter REG Number'),

                          ),
                        ),

                        Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: mobileNumberController,
                            keyboardType: TextInputType.phone,
                            maxLength: 10,
                            decoration: textFormFieldDecoration(Icons.phone_android,'Enter Mobile Number'),

                          ),
                        ), //mobile


                        Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: emailController,
                            keyboardType: TextInputType.emailAddress,
                            decoration: textFormFieldDecoration(Icons.email,'Enter Your Email'),

                          ),
                        ),

                        SizedBox(
                          height: 10,
                        ),
                        Container(
                          padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
                          child: DropdownButtonFormField(
                            // Initial Value
                            value: dropdownTypeOfPlans,
                            isExpanded: true,
                            decoration: textFormFieldDecoration(Icons.next_plan_outlined,'Type of plan'),
                            hint: Text('Select Type of water'),
                            // Down Arrow Icon
                            icon: const Icon(Icons.keyboard_arrow_down),

                            // Array list of items
                            items: typeOfCategoryPlans.map((String items) {
                              return DropdownMenuItem(
                                value: items,
                                child: Text(items),
                              );
                            }).toList(),
                            // After selecting the desired option,it will
                            // change button value to selected value
                            onChanged: (String? newValue) {
                              setState(() {
                                dropdownTypeOfPlans = newValue!;
                              });
                            },
                          ),
                        ),


                        SizedBox(
                          height: 10,
                        ),
                        GestureDetector(
                          child:   Container(
                            padding: const EdgeInsets.all(10),
                            child: TextFormField(
                              cursorColor: greyColor,
                              controller: userAddressCapturingController,
                              onTap:()
                              {

                                //=============================================================================================

                                location.serviceEnabled().then((value) {
                                  if (value) {
                                    initRenderer();
                                    Navigator.push(
                                      context,
                                      MaterialPageRoute(
                                        builder: (context) {
                                          return PlacePicker(
                                            resizeToAvoidBottomInset: false,
                                            hintText: "Find a place ...",
                                            searchingText: "Please wait ...",
                                            selectText: "Select place",
                                            outsideOfPickAreaText: "Place not in area",
                                            initialPosition: kInitialPosition,
                                            useCurrentLocation: true,
                                            selectInitialPosition: true,
                                            usePinPointingSearch: true,
                                            usePlaceDetailSearch: true,
                                            zoomGesturesEnabled: true,
                                            zoomControlsEnabled: true,
                                            onMapCreated: (GoogleMapController controller) {},
                                            onPlacePicked: (PickResult result) {
                                              setState(() {
                                                selectedPlace = result;
                                                lat=selectedPlace!.geometry!.location.lat;
                                                lng=selectedPlace!.geometry!.location.lng;
                                                if(selectedPlace!.types!.length==1){
                                                  userAddressCapturingController.text =
                                                  selectedPlace!.formattedAddress!;
                                                }
                                                else{
                                                  userAddressCapturingController.text =selectedPlace!.name!+', '+selectedPlace!.formattedAddress!;
                                                }
                                                Navigator.of(context).pop();
                                              });
                                            },
                                            onMapTypeChanged: (MapType mapType) {},
                                            apiKey: Platform.isAndroid
                                                ? APIKeys.androidApiKey
                                                : APIKeys.iosApiKey,
                                            forceAndroidLocationManager: true,
                                          );
                                        },
                                      ),
                                    );
                                  } else {
                                    showGeneralDialog(
                                      context: context,
                                      pageBuilder: (context, x, y) {
                                        return Scaffold(
                                          backgroundColor: Colors.grey.withOpacity(.5),
                                          body: Center(
                                            child: Container(
                                              width: double.infinity,
                                              height: 150,
                                              padding:
                                              const EdgeInsets.symmetric(horizontal: 20),
                                              child: Card(
                                                child: Padding(
                                                  padding: const EdgeInsets.all(10.0),
                                                  child: Column(
                                                    mainAxisAlignment: MainAxisAlignment.center,
                                                    children: [
                                                      const Text(
                                                        "Please enable the location",
                                                        style: TextStyle(
                                                          fontSize:18,
                                                          fontWeight: FontWeight.w500,
                                                        ),
                                                      ),
                                                      const SizedBox(
                                                        height: 20,
                                                      ),
                                                      ElevatedButton(
                                                        onPressed: () {
                                                          Navigator.pop(context);
                                                        },
                                                        child: const Text("Cancel"),
                                                      ),
                                                    ],
                                                  ),
                                                ),
                                              ),
                                            ),
                                          ),
                                        );
                                      },
                                    );
                                  }
                                });



                                //=====================================================================================

                                // _getCurrentPosition();
                              },
                              keyboardType: TextInputType.streetAddress,
                              readOnly: true,
                              decoration: textFormFieldDecoration(Icons.location_on_rounded,'select address from MAP'),

                            ),
                          ),
                          /*   onTap: ()
                        {
                        },*///address
                        ),//address capturing
                        const SizedBox(
                          height: 5,
                        ),
                        Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: userAddressDescriptionController,
                            textCapitalization: TextCapitalization.characters,
                            decoration: textFormFieldDecoration(Icons.plagiarism_outlined,'Address Description ex:FlatNo [Optional]'),
                          ),
                        ),//address description
                        const SizedBox(
                          height: 5,
                        ),
                      /*  Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: pharmaOpentimeController,
                            keyboardType: TextInputType.datetime,
                            decoration: const InputDecoration(
                              prefixIcon: Icon(
                                Icons.watch_later_outlined,
                                color: primaryColor,
                              ),
                              border: OutlineInputBorder(
                                  borderSide: BorderSide(color: primaryColor)),
                              focusedBorder: OutlineInputBorder(
                                borderSide: BorderSide(color: primaryColor),
                              ),
                              enabledBorder: OutlineInputBorder(
                                borderSide: BorderSide(color: primaryColor),
                              ),
                              labelText: 'Pharma Open Timing',
                              labelStyle: TextStyle(
                                color: greyColor, //<-- SEE HERE
                              ),
                            ),
                          ),
                        ),
                        const SizedBox(
                          height: 5,
                        ),
                        Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            controller: pharmaClosetimeController,
                            keyboardType: TextInputType.datetime,
                            decoration: const InputDecoration(
                              prefixIcon: Icon(
                                Icons.watch_later_outlined,
                                color: primaryColor,
                              ),
                              border: OutlineInputBorder(
                                  borderSide: BorderSide(color: primaryColor)),
                              focusedBorder: OutlineInputBorder(
                                borderSide: BorderSide(color: primaryColor),
                              ),
                              enabledBorder: OutlineInputBorder(
                                borderSide: BorderSide(color: primaryColor),
                              ),
                              labelText: 'Pharma Close Timing',
                              labelStyle: TextStyle(
                                color: greyColor, //<-- SEE HERE
                              ),
                            ),
                          ),
                        ),

                        const SizedBox(
                          height: 5,
                        ),*/

                        Container(
                          padding: const EdgeInsets.all(10),
                          child: TextFormField(
                            cursorColor: greyColor,
                            obscureText: isPwdObscureText,
                            controller: passwordController,
                            decoration: textFormFieldDecoration(Icons.lock,'Create Password'),
                          ),
                        ), //pwd
                        const SizedBox(
                          height: 5,
                        ),
                        Container(
                            width:MediaQuery.of(context).size.width * .99,
                            height: 55,
                            padding: const EdgeInsets.fromLTRB(3, 0, 3, 0),
                            child: ElevatedButton(
                              style: ElevatedButton.styleFrom(
                                primary: buttonColor, // background
                                onPrimary: Colors.white, // foreground
                              ),
                              onPressed: () async {
                                if (nameController.text != '' &&
                                    passwordController.text != '' &&
                                    mobileNumberController.text != ''&&
                                emailController.text != '') {
                                  AppSettings.preLoaderDialog(context);

                                  var payload = new Map<String, dynamic>();
                                  payload["pharmacyname"] = nameController.text.toString();
                                  payload["password"] =
                                      passwordController.text.toString();
                                  payload["phone"] =
                                      mobileNumberController.text.toString();
                                  payload["emails"] = [
                                    {"email": emailController.text.toString()}
                                  ];
                                  payload["pharmacy_address"] = userAddressCapturingController.text;
                                  payload["registration_number"] = pharmaRegController.text;
                                  payload["city"] = city;
                                  payload["state"] = state;
                                  payload["zip"] = zip;
                                  payload["country"] = country;
                                  payload["description"] = '';
                                  payload["plan"] = dropdownTypeOfPlans.toString();
                                  payload["latitude"] = lat;
                                  payload["longitude"] = lng;
                                  payload["fcmId"] = AppSettings.fcmId;

                                  bool signUpStatus = await AppSettings.signUp(payload);

                                  try {
                                    if (signUpStatus) {
                                      var smsPayload = new Map<String, dynamic>();
                                      smsPayload["mobileNumbers"] = mobileNumberController.text.toString();
                                      bool sendSms = await AppSettings.sendSms(smsPayload);

                                      if(sendSms){
                                        Navigator.of(context, rootNavigator: true).pop();
                                        Navigator.push(
                                          context,
                                          MaterialPageRoute(
                                              builder: (context) =>  OtpScreen(myObject: mobileNumberController.text.toString(),)),
                                        );
                                      }
                                      else{
                                        Navigator.of(context, rootNavigator: true).pop();
                                      }



                                    }
                                    else {
                                      Navigator.of(context, rootNavigator: true).pop();
                                      /*AppSettings.longFailedToast(
                                          "Mobile number already exists");*/
                                    }
                                  } catch (exception) {
                                    print(exception);
                                    Navigator.of(context, rootNavigator: true).pop();
                                    //AppSettings.longFailedToast("Please enter valid details");
                                  }
                                } else {
                                  //.longFailedToast("details should not be empty");
                                }
                              },
                              child: Text('Sign Up'),
                            )),//login button
                        Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            const Text(
                              'Are you a Member?',
                              style: TextStyle(
                                color: Colors.white,
                              ),
                            ),
                            TextButton(
                              child: const Text(
                                'Login?',
                                style: TextStyle(
                                  fontSize: 20,
                                  color: Colors.white,
                                  decoration: TextDecoration.underline,
                                ),
                              ),
                              onPressed: () {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => const Login()),
                                );
                              },
                            )
                          ],
                        ),
                      ],
                    ),
                  )),
            ),
          ])), );
  }


  showUserSignUSuccessDialog() async {

    healthpharmaid.text=AppSettings.healthpharmaIdsign;

    return showDialog(
      context: context,
      barrierDismissible: false,
      useSafeArea: true,
      builder: (BuildContext context) {
        return StatefulBuilder(
            builder: (BuildContext context, StateSetter setState) {
              return AlertDialog(
                title: const Text('User SignUp Successfully!!'),
                content: SingleChildScrollView(
                  child: ListBody(
                    children: <Widget>[
                      Container(
                        padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
                        child: TextFormField(
                          cursorColor: greyColor,
                          readOnly: true,
                          controller: nameController,
                          decoration: const InputDecoration(
                            prefixIcon: Icon(
                              Icons.person,
                              color: greyColor,
                            ),
                            border: OutlineInputBorder(
                                borderSide: BorderSide(color: greyColor)),
                            focusedBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            enabledBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            labelText: 'User Name',
                            labelStyle: TextStyle(
                              color: greyColor, //<-- SEE HERE
                            ),
                          ),
                        ),
                      ),


                      Container(
                        padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
                        child: TextFormField(
                          cursorColor: greyColor,
                          readOnly: true,
                          controller:healthpharmaid,
                          decoration: const InputDecoration(
                            prefixIcon: Icon(
                              Icons.person,
                              color: greyColor,
                            ),
                            border: OutlineInputBorder(
                                borderSide: BorderSide(color: greyColor)),
                            focusedBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            enabledBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            labelText: 'User Id',
                            labelStyle: TextStyle(
                              color: greyColor, //<-- SEE HERE
                            ),
                          ),
                        ),
                      ),

                      // AppSettings.saveAvailableReportAndLocationsInMemorysignup('customerId');
                      const SizedBox(
                        height:10,
                      ),
                      Container(
                        padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
                        child: TextFormField(
                          cursorColor: greyColor,
                          readOnly: true,
                          controller: buildingNameController,
                          decoration: const InputDecoration(
                            prefixIcon: Icon(
                              Icons.home_filled,
                              color: greyColor,
                            ),
                            border: OutlineInputBorder(
                                borderSide: BorderSide(color: greyColor)),
                            focusedBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            enabledBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            labelText: 'Building Name',
                            labelStyle: TextStyle(
                              color: greyColor, //<-- SEE HERE
                            ),
                          ),
                        ),
                      ),
                      const SizedBox(
                        height:10,
                      ),
                      Container(
                        padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
                        child: TextFormField(
                          cursorColor: greyColor,
                          readOnly: true,
                          controller: emailController,
                          decoration: const InputDecoration(
                            prefixIcon: Icon(
                              Icons.email,
                              color: greyColor,
                            ),
                            border: OutlineInputBorder(
                                borderSide: BorderSide(color: greyColor)),
                            focusedBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            enabledBorder: OutlineInputBorder(
                              borderSide: BorderSide(color: greyColor),
                            ),
                            labelText: 'Email',
                            labelStyle: TextStyle(
                              color: greyColor, //<-- SEE HERE
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
                actions: <Widget>[

                  Container(
                      width: 400,
                      height: 50,
                      padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
                      child: ElevatedButton(
                        style: ElevatedButton.styleFrom(
                          primary: primaryColor, // background
                          onPrimary: Colors.white, // foreground
                        ),
                        onPressed: () async{
                          await Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => const Login()),
                          );

                        },
                        child: const Text('OK'),
                      )),


                  /* Padding(
                  //  padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16  ),
                    padding: EdgeInsets.only(left:75, bottom: 20, right: 70, top:10),
                    child: TextFormField(
                      cursorColor: greyColor,
                      controller: nameController,
                      decoration: const InputDecoration(
                        border: UnderlineInputBorder(),
                        labelText: 'Enter your username',
                      ),
                    ),
                  ),*/


                ],
              );
            });
      },
    );
  }


}
