/*
 *@author: Amjad Amireh Merge to Elham rababah
 *@Date:27/4/2020
 *@param:
 *@return:PatientsScreen

 *@desc:
 */

import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/patient/patient_model.dart';
import 'package:doctor_app_flutter/models/patient/topten_users_res_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/routes.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';

import '../../config/size_config.dart';
import '../../widgets/shared/app_scaffold_widget.dart';

class PatientsScreen extends StatefulWidget {
  @override
  _PatientsScreenState createState() => _PatientsScreenState();
}

class _PatientsScreenState extends State<PatientsScreen> {
  List<dynamic> lItems;

  List parsed;

  List date;
  List unFilterDate;

  Color sideColor = Colors.black;
  List<PatiantInformtion> responseModelList;
  List<PatiantInformtion> responseModelList2;
  final String url = "assets/images/";
  final String avatarMale = "user_male.svg"; //'working_male.svg';//'user.svg';
  final String avatarFemale = 'user_female.svg';
  final String assetName = 'assets/image.svg';

  // List<String> _locations = ['Today', 'Old Date', 'YESTERDAY'];
  List<String> _locations = []; //['All', 'Today', 'Tomorrow', 'Next Week'];

  int _activeLocation = 0;

  bool _isInit = true;
  String patientType;
  String patientTypeTitle;
  var _isLoading = true;

  bool _isError = false;
  String error = "";
  ProjectViewModel projectsProvider;

  final _controller = TextEditingController();

  PatientModel patient;

/*
 *@author: Amjad Amireh
 *@Date:2/5/2020
 *@param:
 *@return:PatientsScreen Search textbox filter

 *@desc:
 */

  searchData(String str) {
    this.responseModelList = this.responseModelList2;
    var strExist = str.length > 0 ? true : false;
    if (strExist) {
      List<PatiantInformtion> filterData = [];

      for (var i = 0; i < responseModelList2.length; i++) {
        String firstName = responseModelList[i].firstName.toUpperCase();
        String lastName = responseModelList[i].lastName.toUpperCase();
        if (firstName.contains(str.toUpperCase()) ||
            lastName.contains(str.toUpperCase())) {
          filterData.add(responseModelList[i]);
        }
      }

      setState(() {
        this.responseModelList = filterData;
      });
    } else {
      setState(() {
        this.responseModelList = this.responseModelList2;
      });
    }
  }

/*
 *@author: Amjad Amireh
 *@Date:5/5/2020
 *@param:
 *@return:Convert time from Milesecond to date with time

 *@desc:
 */
  convertDate(String str) {
    String timeConvert;
    const start = "/Date(";

    const end = "+0300)";

    final startIndex = str.indexOf(start);

    final endIndex = str.indexOf(end, startIndex + start.length);

    var date = new DateTime.fromMillisecondsSinceEpoch(
        int.parse(str.substring(startIndex + start.length, endIndex)));

    String newDateformat = date.year.toString() +
        "/" +
        date.month.toString().padLeft(2, '0') +
        "/" +
        date.day.toString().padLeft(2, '0') +
        " " +
        "-" +
        " " +
        date.hour.toString().padLeft(2, '0') +
        ":" +
        date.minute.toString().toString().padLeft(2, '0');

    return newDateformat.toString();
  }

/*
 *@author: Amjad Amireh
 *@Date:5/5/2020
 *@param:
 *@return:Convert time from Milesecond to date

 *@desc:
 */
  convertDateFormat(String str) {
    String timeConvert;
    const start = "/Date(";
    const end = "+0300)";

    final startIndex = str.indexOf(start);
    final endIndex = str.indexOf(end, startIndex + start.length);

    var date = new DateTime.fromMillisecondsSinceEpoch(
        int.parse(str.substring(startIndex + start.length, endIndex)));
    String newDate = date.year.toString() +
        "-" +
        date.month.toString().padLeft(2, '0') +
        "-" +
        date.day.toString().padLeft(2, '0');

    return newDate.toString();
  }

  convertDateFormat2(String str) {
    String timeConvert;
    const start = "/Date(";
    const end = "+0300)";

    final startIndex = str.indexOf(start);
    final endIndex = str.indexOf(end, startIndex + start.length);

    var date = new DateTime.fromMillisecondsSinceEpoch(
        int.parse(str.substring(startIndex + start.length, endIndex)));
    String newDate = date.year.toString() +
        "/" +
        date.month.toString().padLeft(2, '0') +
        "/" +
        date.day.toString().padLeft(2, '0');

    return newDate.toString();
  }

  filterBooking(String str) {
    this.responseModelList = this.responseModelList2;

    var strExist = str.length > 0 ? true : false;
    if (true) {
      List<PatiantInformtion> filterDate = [];

      for (var i = 0; i < responseModelList2.length; i++) {
        String patiantAppointment =
            convertDateFormat(responseModelList[i].appointmentDate);

        String dateAppointment = checkDate(patiantAppointment);

        if (dateAppointment.contains(str)) {
          filterDate.add(responseModelList[i]);
        }
      }

      setState(() {
        this.responseModelList = filterDate;
      });
    } else {
      setState(() {
        this.responseModelList = this.responseModelList2;
      });
    }
  }

  String checkDate(String dateString) {
    DateTime checkedTime = DateTime.parse(dateString);
    DateTime currentTime = DateTime.now();

    if ((currentTime.year == checkedTime.year) &&
        (currentTime.month == checkedTime.month) &&
        (currentTime.day == checkedTime.day)) {
      return TranslationBase.of(context).today;
    } else if ((currentTime.year == checkedTime.year) &&
        (currentTime.month == checkedTime.month)) {
      if ((currentTime.day - checkedTime.day) == 1) {
        return TranslationBase.of(context).yesterday;
      } else if ((currentTime.day - checkedTime.day) == -1) {
        return TranslationBase.of(context).tomorrow;
      }

      if ((currentTime.day - checkedTime.day) <= -2) {
        return TranslationBase.of(context).nextWeek;
      } else {
        return TranslationBase.of(context).all;
      }
    }
    return TranslationBase.of(context).all;
  }

/*
 *@author: Amjad Amireh Modified New design
 *@Date:21/5/2020
 *@param:
 *@return:PatientsScreen

 *@desc:
 */
  @override
  Widget build(BuildContext context) {
    _locations = [
      TranslationBase.of(context).all,
      TranslationBase.of(context).today,
      TranslationBase.of(context).tomorrow,
      TranslationBase.of(context).nextWeek,
    ];
    projectsProvider = Provider.of(context);
    final routeArgs = ModalRoute.of(context).settings.arguments as Map;

    patient = routeArgs['patientSearchForm'];

    patientType = routeArgs['selectedType'];

    if (!projectsProvider.isArabic)
      patientTypeTitle = SERVICES_PATIANT_HEADER[int.parse(patientType)];
    else
      patientTypeTitle = SERVICES_PATIANT_HEADER_AR[int.parse(patientType)];

    return BaseView<PatientViewModel>(
      onModelReady: (model) {
        // TODO : change all the logic here to make it work with the model and remove future
        model.getPatientList(patient, patientType).then((res) {
          setState(() {
            _isLoading = false;
            if (res['MessageStatus'] == 1) {
              int val2 = int.parse(patientType);
              lItems = res[SERVICES_PATIANT2[val2]];
              parsed = lItems;
              responseModelList = new ModelResponse.fromJson(parsed).list;
              responseModelList2 = responseModelList;
              _isError = false;
            } else {
              _isError = true;
              error = res['ErrorEndUserMessage'] ?? res['ErrorMessage'];
            }
          });
        }).catchError((error) {

          setState(() {
            _isError = true;
            _isLoading = false;
            this.error = error;
          });
        });
      },
      builder: (_, model, w) => AppScaffold(
        appBarTitle: patientTypeTitle,
        body: _isLoading
            ? DrAppCircularProgressIndeicator()
            : _isError
                ? DrAppEmbeddedError(error: error)
                : lItems == null || lItems.length == 0
                    ? DrAppEmbeddedError(
                        error:
                            TranslationBase.of(context).youDontHaveAnyPatient)
                    : Container(
                        child: ListView(
                          scrollDirection: Axis.vertical,
                          children: <Widget>[
                            Container(
                              child: lItems == null
                                  ? Column(
                                      crossAxisAlignment:
                                          CrossAxisAlignment.start,
                                      children: <Widget>[
                                        Container(
                                          child: Center(
                                              child: Padding(
                                            padding: const EdgeInsets.fromLTRB(
                                                0, 0, 0, 0), //250
                                            child:
                                                DrAppCircularProgressIndeicator(),
                                          )),
                                        ),
                                      ],
                                    )
                                  : Column(
                                      children: <Widget>[
                                        Padding(
                                          padding: EdgeInsets.only(
                                              top: MediaQuery.of(context)
                                                      .size
                                                      .height *
                                                  0.03),
                                          child: SERVICES_PATIANT2[
                                                      int.parse(patientType)] ==
                                                  "List_MyOutPatient"
                                              ? _locationBar(context)
                                              : Container(),
                                        ),
                                        SizedBox(height: 18.5),
                                        Container(
                                          width: SizeConfig.screenWidth * 0.9,
                                          height:
                                              SizeConfig.screenHeight * 0.05,
                                          child: TextField(
                                            controller: _controller,
                                            onChanged: (String str) {
                                              this.searchData(str);
                                            },
                                            decoration: buildInputDecoration(
                                                context,
                                                TranslationBase.of(context)
                                                    .searchPatient),
                                          ),
                                        ),
                                        SizedBox(
                                          height: 10.0,
                                        ),
                                        Divider(
                                          thickness: 0.8,
                                          color: Color(0xffCCCCCC),
                                        ),
                                        Container(
                                          decoration: BoxDecoration(
                                              color: Color(0Xffffffff),
                                              borderRadius:
                                                  BorderRadius.circular(20)),
                                          margin:
                                              EdgeInsets.fromLTRB(0, 0, 0, 0),
                                          child: (responseModelList.length > 0)
                                              ? Column(
                                                  //  mainAxisAlignment: MainAxisAlignment.center,
                                                  children: responseModelList
                                                      .map((PatiantInformtion
                                                          item) {
                                                    return Container(
                                                      decoration:
                                                          myBoxDecoration(),
                                                      child: InkWell(
                                                        child: Row(
                                                          children: <Widget>[
                                                            Column(
                                                              mainAxisAlignment:
                                                                  MainAxisAlignment
                                                                      .start,
                                                              children: <
                                                                  Widget>[
                                                                Padding(
                                                                  padding: EdgeInsets
                                                                      .only(
                                                                          left:
                                                                              12.0),
                                                                  child:
                                                                      Container(
                                                                    decoration:
                                                                        BoxDecoration(
                                                                      boxShadow: [
                                                                        BoxShadow(
                                                                            color: Color.fromRGBO(
                                                                                0,
                                                                                0,
                                                                                0,
                                                                                0.08),
                                                                            offset: Offset(0.0,
                                                                                5.0),
                                                                            blurRadius:
                                                                                16.0)
                                                                      ],
                                                                      borderRadius:
                                                                          BorderRadius.all(
                                                                              Radius.circular(35.0)),
                                                                      color: Color(
                                                                          0xffCCCCCC),
                                                                    ),
                                                                    width: 70,
                                                                    height: 70,
                                                                    child: Icon(
                                                                      item.genderDescription ==
                                                                              "Male"
                                                                          ? DoctorApp
                                                                              .male
                                                                          : DoctorApp
                                                                              .female_icon,
                                                                      size: 70,
                                                                      color: Colors
                                                                          .white,
                                                                    ),
                                                                  ),
                                                                ),
                                                              ],
                                                            ),

                                                            SizedBox(
                                                              width: 10,
                                                            ),

                                                            Expanded(
                                                              child: Column(
                                                                crossAxisAlignment:
                                                                    CrossAxisAlignment
                                                                        .start,
                                                                children: [
                                                                  Column(
                                                                    children: [
                                                                      SizedBox(
                                                                        height:
                                                                            10.0,
                                                                      ),
                                                                      Padding(
                                                                        padding: EdgeInsets.symmetric(
                                                                            vertical:
                                                                                5.5,
                                                                            horizontal:
                                                                                22.5),
                                                                        child:
                                                                            AppText(
                                                                          item.firstName +
                                                                              " " +
                                                                              item.lastName,
                                                                          fontSize:
                                                                              2.0 * SizeConfig.textMultiplier,
                                                                          fontWeight:
                                                                              FontWeight.bold,
                                                                          backGroundcolor:
                                                                              Colors.white,
                                                                        ),
                                                                      ),
                                                                    ],
                                                                  ),
                                                                  Row(
                                                                    mainAxisAlignment:
                                                                        MainAxisAlignment
                                                                            .spaceAround,
                                                                    children: [
                                                                      Column(
                                                                        crossAxisAlignment:
                                                                            CrossAxisAlignment.start,
                                                                        children: <
                                                                            Widget>[
                                                                          Wrap(
                                                                            children: [
                                                                              AppText(
                                                                                TranslationBase.of(context).fileNo,
                                                                                fontSize: 1.8 * SizeConfig.textMultiplier,
                                                                                fontWeight: FontWeight.bold,
                                                                                backGroundcolor: Colors.white,
                                                                              ),
                                                                              AppText(
                                                                                item.patientId.toString(),
                                                                                fontSize: 1.8 * SizeConfig.textMultiplier,
                                                                                fontWeight: FontWeight.w300,
                                                                                backGroundcolor: Colors.white,
                                                                              ),
                                                                            ],
                                                                          ),
                                                                          SizedBox(
                                                                            height:
                                                                                2.5,
                                                                          ),
                                                                          AppText(
                                                                            'NATIONALITY: ' +
                                                                                item.nationalityName.toString(),
                                                                            fontSize:
                                                                                1.8 * SizeConfig.textMultiplier,
                                                                            fontWeight:
                                                                                FontWeight.bold,
                                                                            backGroundcolor:
                                                                                Colors.white,
                                                                          ),
                                                                          SizedBox(
                                                                            height:
                                                                                15.5,
                                                                          ),
                                                                          SERVICES_PATIANT2[int.parse(patientType)] == "List_MyOutPatient"
                                                                              ? Row(
                                                                                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                                                                  children: <Widget>[
                                                                                    Container(
                                                                                      height: 15,
                                                                                      width: 60,
                                                                                      decoration: BoxDecoration(
                                                                                        borderRadius: BorderRadius.circular(25),
                                                                                        color: HexColor("#20A169"),
                                                                                      ),
                                                                                      child: AppText(
                                                                                        item.startTime,
                                                                                        color: Colors.white,
                                                                                        fontSize: 1.5 * SizeConfig.textMultiplier,
                                                                                        textAlign: TextAlign.center,
                                                                                        fontWeight: FontWeight.bold,
                                                                                      ),
                                                                                    ),
                                                                                    SizedBox(
                                                                                      width: 3.5,
                                                                                    ),
                                                                                    Container(
                                                                                      child: AppText(
                                                                                        convertDateFormat2(item.appointmentDate.toString()),
                                                                                        fontSize: 1.5 * SizeConfig.textMultiplier,
                                                                                        fontWeight: FontWeight.bold,
                                                                                      ),
                                                                                    ),
                                                                                    SizedBox(
                                                                                      height: 0.5,
                                                                                    )
                                                                                  ],
                                                                                )
                                                                              : SizedBox(
                                                                                  height: 5,
                                                                                ),
                                                                        ],
                                                                      ),
                                                                      Column(
                                                                        crossAxisAlignment:
                                                                            CrossAxisAlignment.start,
                                                                        // mainAxisAlignment:
                                                                        //     MainAxisAlignment
                                                                        //         .spaceBetween,
                                                                        children: <
                                                                            Widget>[
                                                                          SizedBox(
                                                                            height:
                                                                                0.5,
                                                                          ),
                                                                          SizedBox(
                                                                            height:
                                                                                0,
                                                                          ),
                                                                          Wrap(
                                                                            children: [
                                                                              AppText(
                                                                                TranslationBase.of(context).age2,
                                                                                fontSize: 1.8 * SizeConfig.textMultiplier,
                                                                                fontWeight: FontWeight.bold,
                                                                                backGroundcolor: Colors.white,
                                                                              ),
                                                                              AppText(
                                                                                item.age.toString(),
                                                                                fontSize: 1.8 * SizeConfig.textMultiplier,
                                                                                fontWeight: FontWeight.w300,
                                                                                backGroundcolor: Colors.white,
                                                                              ),
                                                                            ],
                                                                          ),
                                                                          SizedBox(
                                                                            height:
                                                                                2.5,
                                                                          ),
                                                                          Wrap(
                                                                            children: [
                                                                              AppText(
                                                                                TranslationBase.of(context).gender2,
                                                                                fontSize: 1.8 * SizeConfig.textMultiplier,
                                                                                fontWeight: FontWeight.bold,
                                                                                backGroundcolor: Colors.white,
                                                                              ),
                                                                              AppText(
                                                                                item.gender.toString() == '1' ? 'Male' : 'Female',
                                                                                fontSize: 1.8 * SizeConfig.textMultiplier,
                                                                                fontWeight: FontWeight.w300,
                                                                                backGroundcolor: Colors.white,
                                                                              ),
                                                                            ],
                                                                          ),
                                                                          SizedBox(
                                                                            height:
                                                                                8,
                                                                          ),
                                                                          SERVICES_PATIANT2[int.parse(patientType)] == "List_MyOutPatient"
                                                                              ? Row(
                                                                                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                                                                  children: <Widget>[
                                                                                    Container(
                                                                                      height: 15,
                                                                                      width: 60,
                                                                                      decoration: BoxDecoration(
                                                                                        borderRadius: BorderRadius.circular(25),
                                                                                        color: HexColor("#20A169"),
                                                                                      ),
                                                                                      child: AppText(
                                                                                        item.startTime,
                                                                                        color: Colors.white,
                                                                                        fontSize: 1.5 * SizeConfig.textMultiplier,
                                                                                        textAlign: TextAlign.center,
                                                                                        fontWeight: FontWeight.bold,
                                                                                      ),
                                                                                    ),
                                                                                    SizedBox(
                                                                                      width: 3.5,
                                                                                    ),
                                                                                    Container(
                                                                                      child: AppText(
                                                                                        convertDateFormat2(item.appointmentDate.toString()),
                                                                                        fontSize: 1.5 * SizeConfig.textMultiplier,
                                                                                        fontWeight: FontWeight.bold,
                                                                                      ),
                                                                                    ),
                                                                                    SizedBox(
                                                                                      height: 25.5,
                                                                                    ),
                                                                                  ],
                                                                                )
                                                                              : SizedBox(
                                                                                  height: 15,
                                                                                ),
                                                                        ],
                                                                      ),
                                                                    ],
                                                                  ),
                                                                ],
                                                              ),
                                                            ),
                                                            // Divider(color: Colors.grey)
                                                          ],
                                                        ),
                                                        onTap: () {
                                                          Navigator.of(context)
                                                              .pushNamed(
                                                                  PATIENTS_PROFILE,
                                                                  arguments: {
                                                                "patient": item
                                                              });
                                                        },
                                                      ),
                                                    );
                                                  }).toList(),
                                                )
                                              : Center(
                                                  child: DrAppEmbeddedError(
                                                      error: TranslationBase.of(
                                                              context)
                                                          .youDontHaveAnyPatient),
                                                ),
                                        ),
                                      ],
                                    ),
                            )
                          ],
                        ),
                      ),
      ),
    );
  }

  InputDecoration buildInputDecoration(BuildContext context, hint) {
    return InputDecoration(
        prefixIcon: Icon(Icons.search, color: Colors.grey),
        filled: true,
        fillColor: Colors.white,
        hintText: hint,
        hintStyle: TextStyle(fontSize: 1.66 * SizeConfig.textMultiplier),
        enabledBorder: OutlineInputBorder(
          borderRadius: BorderRadius.all(Radius.circular(10.0)),
          borderSide: BorderSide(color: HexColor('#CCCCCC')),
        ),
        focusedBorder: OutlineInputBorder(
          borderRadius: BorderRadius.all(Radius.circular(10.0)),
          borderSide: BorderSide(color: Colors.grey), //),
        ));
  }

  Widget _locationBar(BuildContext _context) {
    return Expanded(
      child: Container(
        height: MediaQuery.of(context).size.height * 0.0619,
        width: SizeConfig.screenWidth * 0.94,
        decoration: BoxDecoration(
          color: Color(0Xffffffff),
          borderRadius: BorderRadius.circular(12.5),
          border: Border.all(
            width: 0.5,
          ),
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          mainAxisSize: MainAxisSize.max,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: _locations.map((item) {
            bool _isActive = _locations[_activeLocation] == item ? true : false;
            return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
              InkWell(
                  child: Center(
                    child: Expanded(
                      child: Container(
                          height: MediaQuery.of(context).size.height * 0.058,
                          width: SizeConfig.screenWidth * 0.2334,
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.only(
                                bottomRight: Radius.circular(12.5),
                                topRight: Radius.circular(12.5),
                                topLeft: Radius.circular(9.5),
                                bottomLeft: Radius.circular(9.5)),
                            color:
                                _isActive ? HexColor("#B8382B") : Colors.white,
                          ),
                          child: Center(
                            child: Text(
                              item,
                              style: TextStyle(
                                fontSize: 12,
                                color: _isActive
                                    ? Colors.white
                                    : Colors.black, //Colors.black,

                                fontWeight: FontWeight.normal,
                              ),
                            ),
                          )),
                    ),
                  ),
                  onTap: () {
                    filterBooking(item.toString());

                    setState(() {
                      _activeLocation = _locations.indexOf(item);
                    });
                  }),
              _isActive
                  ? Container(
                      decoration: BoxDecoration(
                          borderRadius: BorderRadius.only(
                              bottomRight: Radius.circular(10),
                              topRight: Radius.circular(10)),
                          color: Colors.white),
                      alignment: Alignment.center,
                      height: 1,
                      width: SizeConfig.screenWidth * 0.23,
                    )
                  : Container()
            ]);
          }).toList(),
        ),
      ),
    );
  }

  myBoxDecoration() {
    return BoxDecoration(
      border: Border(
        bottom: BorderSide(
          color: Color(0xffCCCCCC),
          width: 0.5,
        ),
      ),
    );
  }
}
