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/project_view_model.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/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:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smart_progress_bar/smart_progress_bar.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();
  AuthenticatedUser user;
  AuthenticatedUser mainUser;
  AuthenticatedUserObject authenticatedUserObject = locator<
      AuthenticatedUserObject>();
  VitalSignService _vitalSignService = locator<VitalSignService>();


  @override
  Widget build(BuildContext context) {
    projectProvider = Provider.of(context);
    return SizedBox(
      width: MediaQuery
          .of(context)
          .size
          .width * 0.75,
      child: Container(
        color: Colors.white,
        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/DQ/DQ_logo.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(),
                            ],
                          ),
                        ),
                      ),
                    ),
                    Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        InkWell(
                          child: DrawerItem(
                              TranslationBase
                                  .of(context)
                                  .arabicChange,
                              Icons.translate),
                          onTap: () {
                            // Navigator.of(context).pushNamed(
                            //   WELCOME_LOGIN,
                            // );
                            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
                                ? InkWell(
                              child: DrawerItem(
                                TranslationBase
                                    .of(context)
                                    .family,
                                Icons.group,
                                textColor: Color(0xFF40ACC9),
                                iconColor: Color(0xFF40ACC9),
                                bottomLine: false,
                                sideArrow: true,
                              ),
                              onTap: () {
                                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('Loading....'));
                                  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),
                                                                    AppText(
                                                                        TranslationBase
                                                                            .of(
                                                                            context)
                                                                            .fileno +
                                                                            ": " +
                                                                            mainUser
                                                                                .patientID
                                                                                .toString()),
                                                                  ])),
                                                        ],
                                                      )))
                                                  : 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
                                                                                              .iD
                                                                                              .toString(),
                                                                                      color: result
                                                                                          .responseID ==
                                                                                          user
                                                                                              .patientID
                                                                                          ? Color(
                                                                                          0xFF40ACC9)
                                                                                          : Colors
                                                                                          .black),
                                                                                ]))),
                                                                  ],
                                                                )))
                                                            : SizedBox();
                                                      }).toList())
                                            ],
                                          ));
                                }
                              },
                            ),
                            InkWell(
                              child: DrawerItem(
                                  TranslationBase
                                      .of(context)
                                      .notification,
                                  Icons.notifications),
                              onTap: () {
                                //NotificationsPage
                                Navigator.of(context).pop();
                                Navigator.push(
                                    context,
                                    MaterialPageRoute(
                                        builder: (BuildContext context) =>
                                            NotificationsPage()));
                              },
                            ),
                            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();
                          },
                        ),
                      ],
                    )
                  ],
                ),
              ),
              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));
      print(data2);
      setState(() {
        this.user = data;
        this.mainUser = data2;
      });
    }
  }

  logout() async {
    authenticatedUserObject.logout();
    projectProvider.isLogin = false;
    await authenticatedUserObject.getUser();
    _vitalSignService.heightCm = "";
    _vitalSignService.weightKg = "";
    await sharedPref.clear();
    this.user = null;
    Navigator.of(context).pushNamed(HOME);
  }

  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();
    result = CheckActivationCode.fromJson(result);
    var familyFile = await sharedPref.getObject(FAMILY_FILE);
    var mainUser = await sharedPref.getObject(MAIN_USER);
    this.sharedPref.clear();
    if (mainUser["PatientID"] != result.list.patientID) {
      result.list.isFamily = true;
    }
    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);
    //this.checkIfUserAgreedBefore(result),
    Navigator.of(context).pushNamed(
      HOME,
    );
  }
}
