import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/admissionRequest/admission-request.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';

import '../../../../routes.dart';

class AdmissionRequestSecondScreen extends StatefulWidget {
  @override
  _AdmissionRequestSecondScreenState createState() =>
      _AdmissionRequestSecondScreenState();
}

class _AdmissionRequestSecondScreenState
    extends State<AdmissionRequestSecondScreen> {
  final _postPlansEstimatedCostController = TextEditingController();
  final _estimatedCostController = TextEditingController();
  final _expectedDaysController = TextEditingController();
  final _otherDepartmentsInterventionsController = TextEditingController();

  DateTime _expectedAdmissionDate;

  dynamic _selectedFloor;
  dynamic _selectedWard;
  dynamic _selectedRoomCategory;

  @override
  Widget build(BuildContext context) {
    final routeArgs = ModalRoute.of(context).settings.arguments as Map;
    PatiantInformtion patient = routeArgs['patient'];
    AdmissionRequest admissionRequest = routeArgs['admission-data'];

    final screenSize = MediaQuery.of(context).size;
    ProjectViewModel projectViewModel = Provider.of(context);

    return BaseView<AdmissionRequestViewModel>(
      builder: (_, model, w) => AppScaffold(
          baseViewModel: model,
          appBarTitle: TranslationBase.of(context).admissionRequest,
          body: GestureDetector(
            onTap: () {
              FocusScopeNode currentFocus = FocusScope.of(context);
              if (!currentFocus.hasPrimaryFocus) {
                currentFocus.unfocus();
              }
            },
            child: Column(
              children: [
                Expanded(
                  child: SingleChildScrollView(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        PatientPageHeaderWidget(patient),
                        Container(
                          margin: EdgeInsets.symmetric(
                              vertical: 16, horizontal: 16),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              SizedBox(
                                height: 16,
                              ),
                              AppText(
                                TranslationBase.of(context)
                                    .postPlansEstimatedCost,
                                fontWeight: FontWeight.bold,
                                fontSize: SizeConfig.textMultiplier * 2.5,
                              ),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                  height: screenSize.height * 0.070,
                                  child: TextField(
                                    decoration:
                                        Helpers.textFieldSelectorDecoration(
                                            TranslationBase.of(context)
                                                .estimatedCost,
                                            null,
                                            false),
                                    enabled: true,
                                    controller: _estimatedCostController,
                                    inputFormatters: [
                                      FilteringTextInputFormatter.allow(
                                          RegExp(ONLY_NUMBERS))
                                    ],
                                    keyboardType: TextInputType.number,
                                  )),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                  child: TextField(
                                decoration: Helpers.textFieldSelectorDecoration(
                                    TranslationBase.of(context).postPlans,
                                    null,
                                    false),
                                enabled: true,
                                controller: _postPlansEstimatedCostController,
                                keyboardType: TextInputType.text,
                                minLines: 4,
                                maxLines: 6,
                              )),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                  child: TextField(
                                    decoration:
                                    Helpers.textFieldSelectorDecoration(
                                        TranslationBase.of(context)
                                            .otherDepartmentsInterventions,
                                        null,
                                        false),
                                    enabled: true,
                                    controller:
                                    _otherDepartmentsInterventionsController,
                                    keyboardType: TextInputType.multiline,
                                    minLines: 2,
                                    maxLines: 4,
                                  )),
                              SizedBox(
                                height: 10,
                              ),
                              AppText(
                                TranslationBase.of(context).otherInformation,
                                fontWeight: FontWeight.bold,
                                fontSize: SizeConfig.textMultiplier * 2.5,
                              ),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                  height: screenSize.height * 0.070,
                                  child: TextField(
                                    decoration:
                                        Helpers.textFieldSelectorDecoration(
                                            TranslationBase.of(context)
                                                .expectedDays,
                                            null,
                                            false),
                                    enabled: true,
                                    controller: _expectedDaysController,
                                    inputFormatters: [
                                      FilteringTextInputFormatter.allow(
                                          RegExp(ONLY_NUMBERS))
                                    ],
                                    keyboardType: TextInputType.number,
                                  )),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                height: screenSize.height * 0.070,
                                child: InkWell(
                                  onTap: () {
                                    if (_expectedAdmissionDate == null) {
                                      _expectedAdmissionDate = DateTime.now();
                                    }
                                    _selectDate(context, _expectedAdmissionDate,
                                        (picked) {
                                      setState(() {
                                        _expectedAdmissionDate = picked;
                                      });
                                    });
                                  },
                                  child: TextField(
                                    decoration: Helpers.textFieldSelectorDecoration(
                                        TranslationBase.of(context)
                                            .expectedAdmissionDate,
                                        _expectedAdmissionDate != null
                                            ? "${DateUtils.convertStringToDateFormat(_expectedAdmissionDate.toString(), "yyyy-MM-dd")}"
                                            : null,
                                        true,
                                        suffixIcon: Icon(
                                          Icons.calendar_today,
                                          color: Colors.black,
                                        )),
                                    enabled: false,
                                  ),
                                ),
                              ),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                height: screenSize.height * 0.070,
                                child: InkWell(
                                  onTap: model.floorList != null &&
                                          model.floorList.length > 0
                                      ? () {
                                          openListDialogField(
                                              'description',
                                              'floorID',
                                              model.floorList, (selectedValue) {
                                            setState(() {
                                              _selectedFloor = selectedValue;
                                            });
                                          });
                                        }
                                      : () async {
                                          GifLoaderDialogUtils.showMyDialog(
                                              context);
                                          await model.getFloors().then((_) =>
                                              GifLoaderDialogUtils.hideDialog(
                                                  context));
                                          if (model.state == ViewState.Idle &&
                                              model.floorList.length > 0) {
                                            openListDialogField('description',
                                                'floorID', model.floorList,
                                                (selectedValue) {
                                              setState(() {
                                                _selectedFloor = selectedValue;
                                              });
                                            });
                                          } else if (model.state ==
                                              ViewState.ErrorLocal) {
                                            DrAppToastMsg.showErrorToast(
                                                model.error);
                                          } else {
                                            DrAppToastMsg.showErrorToast(
                                                "Empty List");
                                          }
                                        },
                                  child: TextField(
                                    decoration:
                                        Helpers.textFieldSelectorDecoration(
                                            TranslationBase.of(context).floor,
                                            _selectedFloor != null
                                                ? _selectedFloor['description']
                                                : null,
                                            true),
                                    enabled: false,
                                  ),
                                ),
                              ),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                height: screenSize.height * 0.070,
                                child: InkWell(
                                  onTap: model.wardList != null &&
                                          model.wardList.length > 0
                                      ? () {
                                          openListDialogField(
                                              'description',
                                              'nursingStationID',
                                              model.wardList, (selectedValue) {
                                            setState(() {
                                              _selectedWard = selectedValue;
                                            });
                                          });
                                        }
                                      : () async {
                                          GifLoaderDialogUtils.showMyDialog(
                                              context);
                                          await model.getWards().then((_) =>
                                              GifLoaderDialogUtils.hideDialog(
                                                  context));
                                          if (model.state == ViewState.Idle &&
                                              model.wardList.length > 0) {
                                            openListDialogField(
                                                'description',
                                                'nursingStationID',
                                                model.wardList,
                                                (selectedValue) {
                                              setState(() {
                                                _selectedWard = selectedValue;
                                              });
                                            });
                                          } else if (model.state ==
                                              ViewState.ErrorLocal) {
                                            DrAppToastMsg.showErrorToast(
                                                model.error);
                                          } else {
                                            DrAppToastMsg.showErrorToast(
                                                "Empty List");
                                          }
                                        },
                                  child: TextField(
                                    decoration:
                                        Helpers.textFieldSelectorDecoration(
                                            TranslationBase.of(context).ward,
                                            _selectedWard != null
                                                ? _selectedWard['description']
                                                : null,
                                            true),
                                    enabled: false,
                                  ),
                                ),
                              ),
                              SizedBox(
                                height: 10,
                              ),
                              Container(
                                height: screenSize.height * 0.070,
                                child: InkWell(
                                  onTap: model.roomCategoryList != null &&
                                          model.roomCategoryList.length > 0
                                      ? () {
                                          openListDialogField(
                                              'description',
                                              'categoryID',
                                              model.roomCategoryList,
                                              (selectedValue) {
                                            setState(() {
                                              _selectedRoomCategory =
                                                  selectedValue;
                                            });
                                          });
                                        }
                                      : () async {
                                          GifLoaderDialogUtils.showMyDialog(
                                              context);
                                          await model.getRoomCategories().then(
                                              (_) => GifLoaderDialogUtils
                                                  .hideDialog(context));
                                          if (model.state == ViewState.Idle &&
                                              model.roomCategoryList.length >
                                                  0) {
                                            openListDialogField(
                                                'description',
                                                'categoryID',
                                                model.roomCategoryList,
                                                (selectedValue) {
                                              setState(() {
                                                _selectedRoomCategory =
                                                    selectedValue;
                                              });
                                            });
                                          } else if (model.state ==
                                              ViewState.ErrorLocal) {
                                            DrAppToastMsg.showErrorToast(
                                                model.error);
                                          } else {
                                            DrAppToastMsg.showErrorToast(
                                                "Empty List");
                                          }
                                        },
                                  child: TextField(
                                    decoration:
                                        Helpers.textFieldSelectorDecoration(
                                            TranslationBase.of(context)
                                                .roomCategory,
                                            _selectedRoomCategory != null
                                                ? _selectedRoomCategory[
                                                    'description']
                                                : null,
                                            true),
                                    enabled: false,
                                  ),
                                ),
                              ),
                              SizedBox(
                                height: 10,
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
                Container(
                  margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
                  child: AppButton(
                    title: TranslationBase.of(context).next,
                    color: HexColor("#B8382B"),
                    onPressed: () async {
                      if (_estimatedCostController.text != "" &&
                          _postPlansEstimatedCostController.text != "" &&
                          _expectedDaysController.text != "" &&
                          _expectedAdmissionDate != null &&
                          _otherDepartmentsInterventionsController.text != "" &&
                          _selectedFloor != null &&
                          _selectedRoomCategory !=
                              null /*_selectedWard is not required*/) {
                        model.admissionRequestData = admissionRequest;

                        model.admissionRequestData.estimatedCost =
                            int.parse(_estimatedCostController.text);
                        model.admissionRequestData.elementsForImprovement =
                            _postPlansEstimatedCostController.text;

                        model.admissionRequestData.expectedDays =
                            int.parse(_expectedDaysController.text);
                        model.admissionRequestData.admissionDate =
                            _expectedAdmissionDate.toIso8601String();
                        model.admissionRequestData
                                .otherDepartmentInterventions =
                            _otherDepartmentsInterventionsController.text;
                        model.admissionRequestData.admissionLocationID =
                            _selectedFloor['floorID'];
                        model.admissionRequestData.wardID =
                            _selectedWard != null
                                ? _selectedWard['nursingStationID']
                                : 0;
                        model.admissionRequestData.roomCategoryID =
                            _selectedRoomCategory['categoryID'];

                        model.admissionRequestData.admissionRequestProcedures =
                            [];
                        Navigator.of(context)
                            .pushNamed(PATIENT_ADMISSION_REQUEST_3, arguments: {
                          'patient': patient,
                          'admission-data': model.admissionRequestData
                        });
                      } else {
                        DrAppToastMsg.showErrorToast(
                            TranslationBase.of(context).pleaseFill);
                      }
                    },
                  ),
                ),
              ],
            ),
          )),
    );
  }

  Future _selectDate(BuildContext context, DateTime dateTime,
      Function(DateTime picked) updateDate) async {
    final DateTime picked = await showDatePicker(
      context: context,
      initialDate: dateTime,
      firstDate: DateTime.now(),
      lastDate: DateTime(2040),
      initialEntryMode: DatePickerEntryMode.calendar,
    );
    if (picked != null && picked != dateTime) {
      updateDate(picked);
    }
  }

  void openListDialogField(String attributeName, String attributeValueId,
      List<dynamic> list, Function(dynamic selectedValue) okFunction) {
    ListSelectDialog dialog = ListSelectDialog(
      list: list,
      attributeName: attributeName,
      attributeValueId: attributeValueId,
      usingSearch: true,
      okText: TranslationBase.of(context).ok,
      okFunction: (selectedValue) {
        okFunction(selectedValue);
      },
    );
    showDialog(
      barrierDismissible: false,
      context: context,
      builder: (BuildContext context) {
        return dialog;
      },
    );
  }
}
