import 'dart:io';

import 'package:diplomaticquarterapp/analytics/google-analytics.dart';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/Authentication/select_device_imei_res.dart';
import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart';
import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart';
import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart';
import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart'
    as family;
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import 'package:diplomaticquarterapp/uitl/CalendarUtils.dart';
import 'package:diplomaticquarterapp/uitl/HMGNetworkConnectivity.dart';
import 'package:diplomaticquarterapp/uitl/HMG_Geofence.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.dart';
import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/location_util.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart';
import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart';
import 'package:firebase_analytics/observer.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import '../../locator.dart';
import '../../routes.dart';
import 'home_page.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';

class LandingPage extends StatefulWidget {
  static LandingPage shared;
  _LandingPageState state;
  LandingPage() {
    LandingPage.shared = this;
  }

  static bool isOpenCallPage = false;

  static IncomingCallData incomingCallData = new IncomingCallData();

  @override
  _LandingPageState createState() => state = _LandingPageState();

  switchToDoFromHMGServices() {
    state.changeCurrentTab(4);
  }
}

class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
  var authProvider = new AuthProvider();

  int currentTab = 0;
  PageController pageController;
  ProjectViewModel projectViewModel;
  ToDoCountProviderModel model;
  var notificationCount = '';
  var themeNotifier;

  ///inject the user data
  AuthenticatedUserObject authenticatedUserObject =
      locator<AuthenticatedUserObject>();

  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  final authService = new AuthProvider();

  var event = RobotProvider();
  var familyFileProvider = family.FamilyFilesProvider();

  void _requestIOSPermissions() {
    flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<
            IOSFlutterLocalNotificationsPlugin>()
        ?.requestPermissions(
          alert: true,
          badge: true,
          sound: true,
        );
  }

  bool isPageNavigated = false;
  LocationUtils locationUtils;

  changeCurrentTab(int tab) {
    setState(() {
      if (currentTab > 0 && tab == 2)
        pageController.jumpToPage(0);
      else if (tab != 0) {
        if (tab == 4 && projectViewModel.isLogin && model.count == 0) {
          AppToast.showErrorToast(
              message: TranslationBase.of(context).noBookedAppo);
        } else {
          pageController.jumpToPage(tab);
        }
      } else {
        IS_VOICE_COMMAND_CLOSED = false;

        pageController.jumpToPage(tab);
      }
      currentTab = tab;
    });
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);

    var route = ModalRoute.of(context);

    if (route != null) {
      print(route.settings.name);
    }

    //setState(() {
    print("didChangeAppLifecycleState");
    print('state = $state');
    AppGlobal.context = context;
    if (state == AppLifecycleState.resumed) {
      print(LandingPage.isOpenCallPage);
      if (LandingPage.isOpenCallPage) {
        if (!isPageNavigated) {
          isPageNavigated = true;
          Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => IncomingCall(
                          incomingCallData: LandingPage.incomingCallData)))
              .then((value) {
            isPageNavigated = false;
          });
        }
      }
    }

    if (state == AppLifecycleState.paused) {
      isPageNavigated = false;
    }

    if (state == AppLifecycleState.inactive) {
      isPageNavigated = false;
    }
    //});
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);

    AppGlobal.context = context;

    _requestIOSPermissions();
    pageController = PageController(keepPage: true);
    _firebaseMessaging.setAutoInitEnabled(true);

    locationUtils =
        new LocationUtils(isShowConfirmDialog: true, context: context);
    WidgetsBinding.instance.addPostFrameCallback((_) {
      locationUtils.getCurrentLocation();
      if (projectViewModel.isLogin) {
        familyFileProvider.getSharedRecordByStatus();
      }
    });
    // HMG (Guest/Internet) Wifi Access [Zohaib Kambrani]
    HMGNetworkConnectivity(context, () {
      GifLoaderDialogUtils.showMyDialog(context);
      PlatformBridge()
          .connectHMGGuestWifi()
          .then((value) => {GifLoaderDialogUtils.hideDialog(context)});
    }).checkAndConnectIfNoInternet();

    if (Platform.isIOS) {
      _firebaseMessaging.requestNotificationPermissions();
    }

    requestPermissions().then((results) {
      // registerGeofences();

      if (results[Permission.notification].isGranted)
        _firebaseMessaging.getToken().then((String token) {
          sharedPref.setString(PUSH_TOKEN, token);
          if (token != null && DEVICE_TOKEN == "") {
            DEVICE_TOKEN = token;
            checkUserStatus(token);
            if (projectViewModel.isLogin)
              this.getNotificationCount(DEVICE_TOKEN);
          }
        });
      if (results[Permission.location].isGranted) ;
      if (results[Permission.storage].isGranted) ;
      if (results[Permission.camera].isGranted) ;
      if (results[Permission.photos].isGranted) ;
      if (results[Permission.accessMediaLocation].isGranted) ;
      // if (results[Permission.calendar].isGranted) ;
    });
    requestPermissions();

    // });
    //
    // //_firebase Background message handler
    // _firebaseMessaging.configure(
    //     //   onMessage: (Map<String, dynamic> message) async {
    //     //     showDialog("onMessage: $message");
    //     //     print("onMessage: $message");
    //     //     print(message);
    //     //     print(message['name']);
    //     //     print(message['appointmentdate']);
    //     //
    //     //     if (Platform.isIOS) {
    //     //       if (message['is_call'] == "true") {
    //     //         var route = ModalRoute.of(context);
    //     //
    //     //         if (route != null) {
    //     //           print(route.settings.name);
    //     //         }
    //     //
    //     //         Map<String, dynamic> myMap = new Map<String, dynamic>.from(message);
    //     //         print(myMap);
    //     //         LandingPage.isOpenCallPage = true;
    //     //         LandingPage.incomingCallData = IncomingCallData.fromJson(myMap);
    //     //         if (!isPageNavigated) {
    //     //           isPageNavigated = true;
    //     //           Navigator.push(
    //     //                   context,
    //     //                   MaterialPageRoute(
    //     //                       builder: (context) => IncomingCall(
    //     //                           incomingCallData: LandingPage.incomingCallData)))
    //     //               .then((value) {
    //     //             isPageNavigated = false;
    //     //           });
    //     //         }
    //     //       } else {
    //     //         print("Is Call Not Found iOS");
    //     //       }
    //     //     } else {
    //     //       print("Is Call Not Found iOS");
    //     //     }
    //     //
    //     //     if (Platform.isAndroid) {
    //     //       if (message['data'].containsKey("is_call")) {
    //     //         var route = ModalRoute.of(context);
    //     //
    //     //         if (route != null) {
    //     //           print(route.settings.name);
    //     //         }
    //     //
    //     //         Map<String, dynamic> myMap =
    //     //             new Map<String, dynamic>.from(message['data']);
    //     //         print(myMap);
    //     //         LandingPage.isOpenCallPage = true;
    //     //         LandingPage.incomingCallData = IncomingCallData.fromJson(myMap);
    //     //         if (!isPageNavigated) {
    //     //           isPageNavigated = true;
    //     //           Navigator.push(
    //     //                   context,
    //     //                   MaterialPageRoute(
    //     //                       builder: (context) => IncomingCall(
    //     //                           incomingCallData: LandingPage.incomingCallData)))
    //     //               .then((value) {
    //     //             isPageNavigated = false;
    //     //           });
    //     //         }
    //     //       } else {
    //     //         print("Is Call Not Found Android");
    //     //       }
    //     //     } else {
    //     //       print("Is Call Not Found Android");
    //     //     }
    //     //   },
    //     //   onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler,
    //     //   onLaunch: (Map<String, dynamic> message) async {
    //     //     print("onLaunch: $message");
    //     //     showDialog("onLaunch: $message");
    //     //   },
    //     //   onResume: (Map<String, dynamic> message) async {
    //     //     print("onResume: $message");
    //     //     print(message);
    //     //     print(message['name']);
    //     //     print(message['appointmentdate']);
    //     //
    //     //     showDialog("onResume: $message");
    //     //
    //     //     if (Platform.isIOS) {
    //     //       if (message['is_call'] == "true") {
    //     //         var route = ModalRoute.of(context);
    //     //
    //     //         if (route != null) {
    //     //           print(route.settings.name);
    //     //         }
    //     //
    //     //         Map<String, dynamic> myMap =
    //     //         new Map<String, dynamic>.from(message);
    //     //         print(myMap);
    //     //         LandingPage.isOpenCallPage = true;
    //     //         LandingPage.incomingCallData = IncomingCallData.fromJson(myMap);
    //     //         if (!isPageNavigated) {
    //     //           isPageNavigated = true;
    //     //           Navigator.push(
    //     //               context,
    //     //               MaterialPageRoute(
    //     //                   builder: (context) => IncomingCall(
    //     //                       incomingCallData: LandingPage.incomingCallData)))
    //     //               .then((value) {
    //     //             isPageNavigated = false;
    //     //           });
    //     //         }
    //     //       } else {
    //     //         print("Is Call Not Found iOS");
    //     //       }
    //     //     } else {
    //     //       print("Is Call Not Found iOS");
    //     //     }
    //     //   },
    //     );
  }

  showDialogs(String message) {
    ConfirmDialog dialog = new ConfirmDialog(
        context: context,
        confirmMessage: message,
        okText: TranslationBase.of(context).confirm,
        cancelText: TranslationBase.of(context).cancel_nocaps,
        okFunction: () => {},
        cancelFunction: () => {});
    dialog.showAlertDialog(context);
  }

  Future<Map<Permission, PermissionStatus>> requestPermissions() async {
    var permissionResults = [
      Permission.location,
      Permission.locationAlways,
      Permission.storage,
      Permission.camera,
      Permission.photos,
      Permission.notification,
      Permission.accessMediaLocation,
      // Permission.calendar,
      Permission.activityRecognition
    ].request();

    // var permissionsGranted = await deviceCalendarPlugin.hasPermissions();
    // if (permissionsGranted.isSuccess && !permissionsGranted.data) {
    //   permissionsGranted = await deviceCalendarPlugin.requestPermissions();
    //   if (!permissionsGranted.isSuccess || !permissionsGranted.data) {}
    // }
    return permissionResults;
  }

  static Future<dynamic> myBackgroundMessageHandler(
      Map<String, dynamic> message) async {
    Map<String, dynamic> myMap = new Map<String, dynamic>.from(message['data']);
    if (message.containsKey('data')) {
      print("myBackgroundMessageHandler Inside");
      LandingPage.incomingCallData = IncomingCallData.fromJson(myMap);
      print(LandingPage.incomingCallData.doctorname);
      LandingPage.isOpenCallPage = true;
    }

    if (message.containsKey('notification')) {
      final dynamic notification = message['notification'];
      print(notification);
    }
  }

  void setUserValues(value) async {
    if (value != null) sharedPref.setObject(IMEI_USER_DATA, value);
  }

  Future<dynamic> getUserInformation() async {
    var userInfoJson = sharedPref.getObject(IMEI_USER_DATA);
    return userInfoJson;
  }

  checkValue(projectProvider) {
    if (projectProvider.searchValue != null) {
      changeCurrentTab(2);
    }
  }

  registerGeofences() async {
    await locator<GeofencingServices>().getAllGeoZones(GeoZonesRequestModel());

    void doIt() {
      getUserInformation().then((value) {
        if (value != null)
          projectViewModel.platformBridge().registerHmgGeofences();
      });
    }

    if (await Permission.location.isGranted) {
      doIt();
    } else {
      [Permission.location].request().then((value) async {
        if (await Permission.location.isGranted) {
          doIt();
        }
      });
    }
  }

  login() async {
    var data = await sharedPref.getObject(IMEI_USER_DATA);
    sharedPref.remove(REGISTER_DATA_FOR_LOGIIN);
    if (data != null) {
      Navigator.of(context).pushNamed(CONFIRM_LOGIN);
    } else {
      GifLoaderDialogUtils.showMyDialog(context);
      authService
          .selectDeviceImei(DEVICE_TOKEN)
          .then((SelectDeviceIMEIRES value) {
        GifLoaderDialogUtils.hideDialog(context);
        if (value != null) {
          setUserValues(value);
          Navigator.of(context).pushNamed(CONFIRM_LOGIN);
        } else {
          Navigator.of(context).pushNamed(
            WELCOME_LOGIN,
          );
        }
      }).catchError((err) {
        GifLoaderDialogUtils.hideDialog(context);
        Navigator.of(context).pushNamed(
          WELCOME_LOGIN,
        );
      });
    }
  }

  getNotificationCount(token) async {
    if (await sharedPref.getObject(USER_PROFILE) != null) {
      var data =
          AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE));
      if (data != null) {
        // authService
        //     .registeredAuthenticatedUser(data, token, 0, 0)
        //     .then((res) => {print(res)});
        authService.getDashboard().then((value) => {
              if (value != null)
                {
                  setState(() {
                    notificationCount = value['List_PatientDashboard'][0]
                                ['UnreadPatientNotificationCount'] >
                            99
                        ? '99+'
                        : value['List_PatientDashboard'][0]
                                ['UnreadPatientNotificationCount']
                            .toString();

                    sharedPref.setString(NOTIFICATION_COUNT, notificationCount);
                  })
                }
            });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    projectViewModel = Provider.of(context);
    model = Provider.of<ToDoCountProviderModel>(context);

    return Scaffold(
        appBar: AppBar(
          elevation: 0,
          textTheme: TextTheme(
            headline6: TextStyle(
                color: Theme.of(context).textTheme.headline1.color,
                fontWeight: FontWeight.bold),
          ),
          title: Text(
            getText(currentTab).toUpperCase(),
            style: TextStyle(
                fontWeight: FontWeight.bold,
                color: Theme.of(context).textTheme.headline1.color,
                fontFamily: projectViewModel.isArabic ? 'Cairo' : 'WorkSans'),
            // bold: true,
            // color: Colors.white,
          ),
          leading: Builder(
            builder: (BuildContext context) {
              return new Stack(
                children: <Widget>[
                  currentTab == 0
                      ? IconButton(
                          icon: Icon(Icons.menu),
                          color: Theme.of(context).textTheme.headline1.color,
                          onPressed: () => Scaffold.of(context).openDrawer(),
                        )
                      : IconButton(
                          icon: Icon(Icons.arrow_back),
                          color: Theme.of(context).textTheme.headline1.color,
                          onPressed: () {
                            setState(() {
                              currentTab = 0;
                            });

                            pageController.jumpToPage(0);
                          },
                        ),
                  notificationCount != ''
                      ? new Positioned(
                          right: projectViewModel.isArabic ? 35 : 0,
                          top: 5,
                          child: new Container(
                            padding: EdgeInsets.all(4),
                            decoration: new BoxDecoration(
                              color: Colors.red,
                              borderRadius: BorderRadius.circular(20),
                            ),
                            constraints: BoxConstraints(
                              minWidth: 20,
                              minHeight: 20,
                            ),
                            child: new Text(
                              notificationCount,
                              style: new TextStyle(
                                color: Colors.white,
                                fontSize: projectViewModel.isArabic ? 8 : 9,
                              ),
                              textAlign: TextAlign.center,
                            ),
                          ),
                        )
                      : SizedBox()
                ],
              );
            },
          ),
          actions: [
            IconButton(
              //iconSize: 70,
              icon: Icon(
                projectViewModel.isLogin ? Icons.settings : Icons.login,
                color: Theme.of(context).textTheme.headline1.color,
              ),
              onPressed: () {
                if (projectViewModel.isLogin)
                  Navigator.of(context).pushNamed(
                    SETTINGS,
                  );
                else
                  login();
              }, //do something,
            )
          ],
          centerTitle: true,
        ),
        drawer: SafeArea(child: AppDrawer()),
        extendBody: true,
        body: PageView(
          physics: NeverScrollableScrollPhysics(),
          controller: pageController,
          children: [
            HomePage(
              goToMyProfile: () {
                changeCurrentTab(1);
              },
            ),
            MedicalProfilePage(),
            BookingOptions(),
            MyFamily(isAppbarVisible: false),
            ToDo(isShowAppBar: false),
          ], // Please do not remove the BookingOptions from this array
        ),
        bottomNavigationBar: BottomNavBar(
          changeIndex: changeCurrentTab,
          index: currentTab,
        ),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButton:
            (projectViewModel.havePrivilege(34) && currentTab == 0)
                ? FloatingButton(
                    elevation: true,
                    onTap: () {
                      changeCurrentTab(2);
                    })
                : null);
  }

  triggerRobot() {
    event.setValue({"isRobot": 'true'});
  }

  getText(currentTab) {
    switch (currentTab) {
      case 0:
        return TranslationBase.of(context).home;
      case 1:
        return TranslationBase.of(context).medicalProfile;
      case 2:
        return TranslationBase.of(context).bookAppo;
      case 5:
        return TranslationBase.of(context).bookAppo;
      case 3:
        return TranslationBase.of(context).services;
      case 4:
        return TranslationBase.of(context).bookAppo;
    }
  }

  void checkUserStatus(token) async {
    authService
        .selectDeviceImei(token)
        .then((SelectDeviceIMEIRES value) => setUserValues(value));
    if (projectViewModel.isLoading == true) {
      var data =
          AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE));
      if (data != null) {
        authService
            .registeredAuthenticatedUser(data, token, 0, 0)
            .then((res) => {print(res)});
        authService.getDashboard().then((value) => {
              setState(() {
                if (value != null) {
                  notificationCount = value['List_PatientDashboard'][0]
                          ['UnreadPatientNotificationCount']
                      .toString();
                }
              })
            });
      }
    }
  }
}
