import 'dart:io';

import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/pages/DrawerPages/notifications/notifications_page.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart';
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';

import '../../config/size_config.dart';
import '../../locator.dart';
import 'drawer_item_widget.dart';

class AppDrawer extends StatefulWidget {
  @override
  _AppDrawerState createState() => _AppDrawerState();
}

class _AppDrawerState extends State<AppDrawer> {
  @override
  void initState() {
    super.initState();
    checkUserData();
  }

  ProjectViewModel projectProvider;
  var sharedPref = new AppSharedPreferences();
  var familyFileProvider = FamilyFilesProvider();
  PharmacyModuleViewModel pharmacyModuleViewModel =
      locator<PharmacyModuleViewModel>();
  AuthenticatedUser user;
  AuthenticatedUser mainUser;
  AuthenticatedUserObject authenticatedUserObject =
      locator<AuthenticatedUserObject>();
  VitalSignService _vitalSignService = locator<VitalSignService>();
  AppointmentRateViewModel appointmentRateViewModel =
      locator<AppointmentRateViewModel>();
  ToDoCountProviderModel toDoProvider;
  String booldType;
  String notificationCount;

  @override
  Widget build(BuildContext context) {
    projectProvider = Provider.of(context);
    return Container(
        width: MediaQuery.of(context).size.width * 0.75,
        color: Theme.of(context).scaffoldBackgroundColor,
        child: Container(
          // color: Colors.white,
          child: Theme(
            data: Theme.of(context).copyWith(
                canvasColor: Theme.of(context).scaffoldBackgroundColor),
            child: Drawer(
              child: Column(
                children: <Widget>[
                  Expanded(
                    flex: 4,
                    child: ListView(
                      padding: EdgeInsets.zero,
                      children: <Widget>[
                        Container(
                          height: SizeConfig.screenHeight * .30,
                          child: InkWell(
                            child: DrawerHeader(
                              child: Column(
                                children: <Widget>[
                                  Container(
                                    child: Image.asset(
                                        'assets/images/logo_HMG.png'),
                                    margin: EdgeInsets.all(
                                        SizeConfig.imageSizeMultiplier * 4),
                                  ),
                                  (user != null && projectProvider.isLogin)
                                      ? Padding(
                                          padding: EdgeInsets.all(15),
                                          child: Column(
                                              mainAxisAlignment:
                                                  MainAxisAlignment.start,
                                              children: <Widget>[
                                                Row(
                                                  children: <Widget>[
                                                    Padding(
                                                        padding:
                                                            EdgeInsets.only(
                                                                right: 5),
                                                        child: Icon(
                                                          Icons.account_circle,
                                                          color:
                                                              Color(0xFF40ACC9),
                                                        )),
                                                    AppText(
                                                      user.firstName +
                                                          ' ' +
                                                          user.lastName,
                                                      color: Color(0xFF40ACC9),
                                                    )
                                                  ],
                                                ),
                                                Row(children: <Widget>[
                                                  Padding(
                                                      padding: EdgeInsets.only(
                                                          left: 30, top: 5),
                                                      child: Column(
                                                        children: <Widget>[
                                                          AppText(
                                                            TranslationBase.of(
                                                                        context)
                                                                    .fileno +
                                                                ": " +
                                                                user.patientID
                                                                    .toString(),
                                                            color: Color(
                                                                0xFF40ACC9),
                                                            fontSize: SizeConfig
                                                                    .textMultiplier *
                                                                1.5,
                                                          ),
                                                          AppText(
                                                            user.bloodGroup !=
                                                                    null
                                                                ? 'Blood Group: ' +
                                                                    user.bloodGroup
                                                                : '',
                                                            fontSize: SizeConfig
                                                                    .textMultiplier *
                                                                1.5,
                                                          ),
                                                        ],
                                                      ))
                                                ])
                                              ]))
                                      : SizedBox(),
                                ],
                              ),
                            ),
                          ),
                        ),
                        Container(
                            child: Column(
                          mainAxisAlignment: MainAxisAlignment.start,
                          children: <Widget>[
                            InkWell(
                              child: DrawerItem(
                                TranslationBase.of(context).arabicChange,
                                Padding(
                                    child:
                                        Image.asset('assets/images/lang.png'),
                                    padding: EdgeInsets.all(3)),
                                isImageIcon: true,
                              ),
                              onTap: () {
                                sharedPref.setBool(IS_ROBOT_INIT, null);
                                if (projectProvider.isArabic) {
                                  projectProvider.changeLanguage('en');
                                } else {
                                  projectProvider.changeLanguage('ar');
                                }
                              },
                            ),
                            (user != null && projectProvider.isLogin)
                                ? Column(
                                    mainAxisAlignment: MainAxisAlignment.start,
                                    children: <Widget>[
                                      (user.isFamily == null ||
                                                  user.isFamily == false) &&
                                              projectProvider.havePrivilege(2)
                                          ? InkWell(
                                              child: DrawerItem(
                                                TranslationBase.of(context)
                                                    .family,
                                                Icons.group,
                                                textColor: Theme.of(context)
                                                    .textTheme
                                                    .bodyText1
                                                    .color,
                                                iconColor: Theme.of(context)
                                                    .textTheme
                                                    .bodyText1
                                                    .color,
                                                bottomLine: false,
                                                sideArrow: true,
                                              ),
                                              onTap: () {
                                                Navigator.of(context).pop();
                                                Navigator.of(context).pushNamed(
                                                  MY_FAMILIY,
                                                );
                                              },
                                            )
                                          : SizedBox(),
                                      FutureBuilder(
                                        future: getFamilyFiles(), // async work
                                        builder: (BuildContext context,
                                            AsyncSnapshot<
                                                    GetAllSharedRecordsByStatusResponse>
                                                snapshot) {
                                          switch (snapshot.connectionState) {
                                            case ConnectionState.waiting:
                                              return Padding(
                                                  padding: EdgeInsets.all(10),
                                                  child: Text(''));
                                            default:
                                              if (snapshot.hasError)
                                                return Padding(
                                                    padding: EdgeInsets.all(10),
                                                    child:
                                                        Text(snapshot.error));
                                              else
                                                return Container(
                                                    decoration: BoxDecoration(
                                                        border: Border(
                                                      bottom: BorderSide(
                                                        //                   <--- left side
                                                        color: Colors.grey[200],
                                                        width: 1.0,
                                                      ),
                                                    )),
                                                    child: Column(
                                                      children: [
                                                        user.isFamily == true
                                                            ? Container(
                                                                padding: EdgeInsets
                                                                    .only(
                                                                        bottom:
                                                                            5),
                                                                child: InkWell(
                                                                    onTap: () {
                                                                      switchUser(
                                                                          mainUser,
                                                                          context);
                                                                    },
                                                                    child: Row(
                                                                      crossAxisAlignment:
                                                                          CrossAxisAlignment
                                                                              .start,
                                                                      children: <
                                                                          Widget>[
                                                                        Expanded(
                                                                          child:
                                                                              Icon(Icons.person),
                                                                        ),
                                                                        Expanded(
                                                                            flex:
                                                                                7,
                                                                            child:
                                                                                Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
                                                                              AppText(mainUser.firstName + ' ' + mainUser.lastName, color: Theme.of(context).textTheme.bodyText1.color),
                                                                              AppText(
                                                                                TranslationBase.of(context).fileno + ": " + mainUser.patientID.toString(),
                                                                                color: Theme.of(context).textTheme.bodyText1.color,
                                                                              ),
                                                                            ])),
                                                                      ],
                                                                    )))
                                                            : SizedBox(),
                                                        Column(
                                                            mainAxisAlignment:
                                                                MainAxisAlignment
                                                                    .start,
                                                            mainAxisSize:
                                                                MainAxisSize
                                                                    .min,
                                                            children: snapshot
                                                                .data
                                                                .getAllSharedRecordsByStatusList
                                                                .map<Widget>(
                                                                    (result) {
                                                              return result
                                                                          .status ==
                                                                      3
                                                                  ? Container(
                                                                      padding: EdgeInsets.only(
                                                                          bottom:
                                                                              5),
                                                                      child: InkWell(
                                                                          onTap: () {
                                                                            switchUser(result,
                                                                                context);
                                                                          },
                                                                          child: Row(
                                                                            crossAxisAlignment:
                                                                                CrossAxisAlignment.start,
                                                                            children: <Widget>[
                                                                              Expanded(
                                                                                child: Icon(Icons.person, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
                                                                              ),
                                                                              Expanded(
                                                                                  flex: 7,
                                                                                  child: Padding(
                                                                                      padding: EdgeInsets.only(left: 5, right: 5),
                                                                                      child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
                                                                                        AppText(result.patientName, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
                                                                                        AppText(TranslationBase.of(context).fileno + ": " + result.responseID.toString(), color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
                                                                                      ]))),
                                                                            ],
                                                                          )))
                                                                  : SizedBox();
                                                            }).toList())
                                                      ],
                                                    ));
                                          }
                                        },
                                      ),
                                      InkWell(
                                        child: Stack(
                                          children: [
                                            DrawerItem(
                                              TranslationBase.of(context)
                                                  .notification,
                                              Icons.notifications,
                                              count: notificationCount != null
                                                  ? new Container(
                                                      padding:
                                                          EdgeInsets.all(4),
                                                      margin: EdgeInsets.all(2),
                                                      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:
                                                              projectProvider
                                                                      .isArabic
                                                                  ? 8
                                                                  : 9,
                                                        ),
                                                        textAlign:
                                                            TextAlign.center,
                                                      ),
                                                      //   ),
                                                    )
                                                  : SizedBox(),
                                            ),
                                          ],
                                        ),
                                        onTap: () {
                                          //NotificationsPage
                                          Navigator.of(context).pop();
                                          Navigator.push(
                                              context,
                                              FadePage(
                                                  page: NotificationsPage()));
                                        },
                                      ),
                                      if (projectProvider.havePrivilege(3))
                                        InkWell(
                                          child: DrawerItem(
                                              TranslationBase.of(context)
                                                  .appsetting,
                                              Icons.settings_input_composite),
                                          onTap: () {
                                            Navigator.of(context).pushNamed(
                                              SETTINGS,
                                            );
                                          },
                                        ),
                                      InkWell(
                                        child: DrawerItem(
                                            TranslationBase.of(context).rateApp,
                                            Icons.star),
                                        onTap: () {
                                          if (Platform.isIOS) {
                                            launch(
                                                "https://apps.apple.com/sa/app/dr-suliaman-alhabib/id733503978");
                                          } else {
                                            launch(
                                                "https://play.google.com/store/apps/details?id=com.ejada.hmg&hl=en");
                                          }
                                        },
                                      ),
                                      InkWell(
                                        child: DrawerItem(
                                            TranslationBase.of(context).logout,
                                            Icons.lock_open),
                                        onTap: () {
                                          logout();
                                        },
                                      )
                                    ],
                                  )
                                : InkWell(
                                    child: DrawerItem(
                                        TranslationBase.of(context)
                                            .loginregister,
                                        Icons.lock_open),
                                    onTap: () {
                                      login();
                                    },
                                  ),
                            // InkWell(
                            //   child: DrawerItem(
                            //       TranslationBase.of(context).appsetting,
                            //       Icons.settings_input_composite),
                            //   onTap: () {
                            //     Navigator.of(context).pushNamed(
                            //       SETTINGS,
                            //     );
                            //   },
                            // )
                          ],
                        ))
                      ],
                    ),
                  ),
                  Expanded(
                    flex: 1,
                    child: Column(
                      children: <Widget>[
                        Container(
                          child: Align(
                            alignment: FractionalOffset.bottomCenter,
                            child: Container(
                              child: Row(
                                mainAxisAlignment:
                                    MainAxisAlignment.spaceEvenly,
                                children: [
                                  Column(
                                    children: <Widget>[
                                      Text(TranslationBase.of(context)
                                          .poweredBy),
                                      Image.asset(
                                        'assets/images/cs_logo_container.png',
                                        width:
                                            SizeConfig.imageSizeMultiplier * 30,
                                      )
                                    ],
                                  ),
                                  Column(
                                    children: <Widget>[
                                      Image.asset(
                                        'assets/images/new-design/vidamobile.png',
                                        width:
                                            SizeConfig.imageSizeMultiplier * 25,
                                      )
                                    ],
                                  ),
                                ],
                              ),
                            ),
                          ),
                        )
                      ],
                    ),
                  )
                ],
              ),
            ),
          ),
        ));
  }

  drawerNavigator(context, routeName) {
    Navigator.of(context).pushNamed(routeName);
  }

  checkUserData() async {
    if (await this.sharedPref.getObject(USER_PROFILE) != null) {
      var data = AuthenticatedUser.fromJson(
          await this.sharedPref.getObject(USER_PROFILE));

      var data2 = AuthenticatedUser.fromJson(
          await this.sharedPref.getObject(MAIN_USER));

      setState(() {
        this.user = data;
        this.mainUser = data2;
      });
    }
  }

  logout() async {
    authenticatedUserObject.logout();
    projectProvider.isLogin = false;
    await authenticatedUserObject.getUser();
    _vitalSignService.heightCm = "";
    _vitalSignService.weightKg = "";
    var appLanguage = await sharedPref.getString(APP_LANGUAGE);
    await sharedPref.clear();
    await sharedPref.setString(APP_LANGUAGE, appLanguage);
    this.user = null;
    Navigator.of(context).pushNamed(HOME);
    // projectProvider.platformBridge().unRegisterHmgGeofences();
  }

  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 {
      Navigator.of(context).pushNamed(
        WELCOME_LOGIN,
      );
    }
  }

  Future<GetAllSharedRecordsByStatusResponse> getFamilyFiles() async {
    if (user != null) {
      if (await sharedPref.getObject(FAMILY_FILE) != null) {
        // print(await sharedPref.getObject(FAMILY_FILE));
        return Future.value(GetAllSharedRecordsByStatusResponse.fromJson(
            await sharedPref.getObject(FAMILY_FILE)));
      } else {
        return familyFileProvider.getSharedRecordByStatus();
      }
    }
  }

  switchUser(user, context) {
    GifLoaderDialogUtils.showMyDialog(context);
    this
        .familyFileProvider
        .silentLoggin(user is AuthenticatedUser ? null : user,
            mainUser: user is AuthenticatedUser)
        .then((value) {
      GifLoaderDialogUtils.hideDialog(context);
      loginAfter(value, context);
    }).catchError((err) {
      GifLoaderDialogUtils.hideDialog(context);
      print(err);
      AppToast.showErrorToast(message: err);
      Navigator.of(context).pop();
    });
  }

  loginAfter(result, context) async {
    Utils.hideProgressDialog();
    Provider.of<ProjectViewModel>(context, listen: false)
        .setPrivilege(privilegeList: result, isLoginChild: true);
    result = CheckActivationCode.fromJson(result);

    var familyFile = await sharedPref.getObject(FAMILY_FILE);
    var currentLang = await sharedPref.getString(APP_LANGUAGE);
    var mainUser = await sharedPref.getObject(MAIN_USER);
    this.sharedPref.clear();
    if (mainUser["PatientID"] != result.list.patientID) {
      result.list.isFamily = true;
    }
    // result.list.cRSVerificationStatus = result['CRSVerificationStatus'];
    this.sharedPref.setString(APP_LANGUAGE, currentLang);

    this.sharedPref.setObject(MAIN_USER, mainUser);
    this.sharedPref.setObject(USER_PROFILE, result.list);
    this.sharedPref.setObject(FAMILY_FILE, familyFile);
    this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID);
    this.sharedPref.setString(TOKEN, result.authenticationTokenID);
    // Navigator.of(context).pop();
    await authenticatedUserObject.getUser(getUser: true);
    Provider.of<ProjectViewModel>(context, listen: false).user =
        authenticatedUserObject.user;
    Provider.of<ProjectViewModel>(context, listen: false)
        .setUser(authenticatedUserObject.user);
    await pharmacyModuleViewModel.generatePharmacyToken().then((value) async {
      if (pharmacyModuleViewModel.error.isNotEmpty)
        await pharmacyModuleViewModel.createUser();
    });

    appointmentRateViewModel
        .getIsLastAppointmentRatedList()
        .then((value) => {
              //getToDoCount(),
              //Utils.hideProgressDialog(),
              if (appointmentRateViewModel.isHaveAppointmentNotRate)
                {
                  Navigator.pushAndRemoveUntil(
                      context,
                      FadePage(
                        page: RateAppointmentDoctor(),
                      ),
                      (r) => false)
                }
              else
                {
                  Navigator.pushAndRemoveUntil(
                      context,
                      FadePage(
                        page: LandingPage(),
                      ),
                      (r) => false)
                }
            })
        .catchError((err) {
      print(err);
      //Utils.hideProgressDialog();
      // GifLoaderDialogUtils.hideDialog(context);
    });
  }
}
