import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_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/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:intl/intl.dart';

import '../../../config/size_config.dart';
import '../../../util/dr_app_shared_pref.dart';
import '../../../util/extenstions.dart';
import '../../../widgets/shared/app_scaffold_widget.dart';
import '../../../widgets/shared/app_texts_widget.dart';

DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();

/* 
 *@author: ibrahim albitar 
 *@Date:4/6/2020  
 *@param: 
 *@return:
 *@desc:
 */

class ReferPatientScreen extends StatefulWidget {
  @override
  _ReferPatientState createState() => _ReferPatientState();
}

class _ReferPatientState extends State<ReferPatientScreen> {
  dynamic _selectedClinic;
  dynamic _selectedDoctor;
  final _extController = TextEditingController();
  int _activePriority = 1;
  dynamic _selectedFrequency;
  final _remarksController = TextEditingController();
  bool isValid;

  @override
  Widget build(BuildContext context) {
    final screenSize = MediaQuery.of(context).size;

    return BaseView<PatientViewModel>(
      onModelReady: (model) => model.getClinicsList(),
      builder: (_, model, w) => AppScaffold(
        baseViewModel: model,
        appBarTitle: TranslationBase.of(context).referralPatient,
        body: model.clinicsList == null
            ? DrAppEmbeddedError(error: 'Something Wrong!')
            : SingleChildScrollView(
                child: Container(
                  margin: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Container(
                        height: screenSize.height * 0.070,
                        child: InkWell(
                          onTap: model.clinicsList != null &&
                                  model.clinicsList.length > 0
                              ? () {
                                  ListSelectDialog dialog = ListSelectDialog(
                                    list: model.clinicsList,
                                    attributeName: 'ClinicDescription',
                                    attributeValueId: 'ClinicID',
                                    okText: TranslationBase.of(context).ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedDoctor = null;
                                        _selectedClinic = selectedValue;
                                        model.getDoctorsList(
                                            _selectedClinic['ClinicID']
                                                .toString());
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                              : null,
                          child: TextField(
                            decoration: textFieldSelectorDecoration(
                                TranslationBase.of(context).clinicSelect,
                                _selectedClinic != null
                                    ? _selectedClinic['ClinicDescription']
                                    : null,
                                true),
                            enabled: false,
                          ),
                        ),
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      Container(
                        height: screenSize.height * 0.070,
                        child: InkWell(
                          onTap: model.doctorsList != null &&
                                  model.doctorsList.length > 0
                              ? () {
                                  ListSelectDialog dialog = ListSelectDialog(
                                    list: model.doctorsList,
                                    attributeName: 'DoctorName',
                                    attributeValueId: 'DoctorID',
                                    okText: TranslationBase.of(context).ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedDoctor = selectedValue;
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                              : null,
                          child: TextField(
                            decoration: textFieldSelectorDecoration(
                                TranslationBase.of(context).doctorSelect,
                                _selectedDoctor != null
                                    ? _selectedDoctor['DoctorName']
                                    : null,
                                true),
                            enabled: false,
                          ),
                        ),
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      Container(
                          height: screenSize.height * 0.070,
                          child: TextField(
                            decoration: textFieldSelectorDecoration(
                                TranslationBase.of(context).ext, null, false),
                            enabled: true,
                            controller: _extController,
                            inputFormatters: [
                              FilteringTextInputFormatter.allow(
                                  RegExp(ONLY_NUMBERS))
                            ],
                            keyboardType: TextInputType.number,
                          )),
                      SizedBox(
                        height: 10,
                      ),
                      priorityBar(context, screenSize),
                      SizedBox(
                        height: 20,
                      ),
                      AppText(
                        "${TranslationBase.of(context).referralFrequency} ${getPriority()}",
                        fontWeight: FontWeight.bold,
                        fontSize: 16,
                      ),
                      SizedBox(
                        height: 20,
                      ),
                      Container(
                        height: screenSize.height * 0.070,
                        child: InkWell(
                          onTap: model.referralFrequencyList != null &&
                                  model.referralFrequencyList.length > 0
                              ? () {
                                  ListSelectDialog dialog = ListSelectDialog(
                                    list: model.referralFrequencyList,
                                    attributeName: 'Description',
                                    attributeValueId: 'ParameterCode',
                                    okText: TranslationBase.of(context).ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedFrequency = selectedValue;
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                              : null,
                          child: TextField(
                            decoration: textFieldSelectorDecoration(
                                TranslationBase.of(context)
                                    .selectReferralFrequency,
                                _selectedFrequency != null
                                    ? _selectedFrequency['Description']
                                    : null,
                                true),
                            enabled: false,
                          ),
                        ),
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      Container(
                          child: TextField(
                        decoration: textFieldSelectorDecoration(
                            TranslationBase.of(context).clinicDetailsandRemarks,
                            null,
                            false),
                        enabled: true,
                        controller: _remarksController,
                        inputFormatters: [
                          FilteringTextInputFormatter.allow(
                              RegExp(ONLY_LETTERS))
                        ],
                        keyboardType: TextInputType.text,
                        minLines: 4,
                        maxLines: 6,
                      )),
                      SizedBox(
                        height: 10,
                      ),
                      Container(
                        child: Column(
                          children: <Widget>[
                            AppText(
                              TranslationBase.of(context).pleaseFill,
                              color: HexColor("#B8382B"),
                              fontWeight: FontWeight.bold,
                              margin: 10,
                              visibility: isValid == null ? false : !isValid,
                            ),
                            // TODO replace AppButton with secondary button and add loading
                            AppButton(
                              title: TranslationBase.of(context).send,
                              color: HexColor("#B8382B"),
                              onPressed: () => {referToDoctor(context, model)},
                            )
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ),
      ),
    );
  }

  Widget priorityBar(BuildContext _context, Size screenSize) {
    List<String> _priorities = [
      TranslationBase.of(context).veryUrgent.toUpperCase(),
      TranslationBase.of(context).urgent.toUpperCase(),
      TranslationBase.of(context).routine.toUpperCase(),
    ];
    return Container(
      height: screenSize.height * 0.070,
      decoration:
          containerBorderDecoration(Color(0Xffffffff), Color(0xFFCCCCCC)),
      child: Row(
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: _priorities.map((item) {
          bool _isActive = _priorities[_activePriority] == item ? true : false;
          return Expanded(
            child: InkWell(
              child: Center(
                child: Container(
                    height: screenSize.height * 0.070,
                    decoration: containerBorderDecoration(
                        _isActive ? HexColor("#B8382B") : Colors.white,
                        _isActive ? HexColor("#B8382B") : Colors.white),
                    child: Center(
                      child: Text(
                        item,
                        style: TextStyle(
                          fontSize: 12,
                          color: _isActive
                              ? Colors.white
                              : Colors.black, //Colors.black,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    )),
              ),
              onTap: () {
                print(_priorities.indexOf(item));
                setState(() {
                  _activePriority = _priorities.indexOf(item);
                });
              },
            ),
          );
        }).toList(),
      ),
    );
  }

  String getPriority() {
    DateTime date = DateTime.now();
    switch (_activePriority) {
      case 0:
        date = date.add(new Duration(hours: 3));
        break;
      case 1:
        date = date.add(new Duration(hours: 6));
        break;
      case 2:
        date = date.add(new Duration(days: 1));
        break;
    }
    var format = DateFormat('yyyy/mm/dd HH:mm a');
    var time = format.format(date);
    print(time);
    return time;
  }

  referToDoctor(BuildContext context, PatientViewModel model) async {
    if (!validation()) {
      return;
    }

    final routeArgs = ModalRoute.of(context).settings.arguments as Map;
    PatiantInformtion patient = routeArgs['patient'];

    try {
      await model.referToDoctor(
          extension: _extController.value.text,
          admissionNo: int.parse(patient.admissionNo),
          referringDoctorRemarks: _remarksController.value.text,
          frequency: _selectedFrequency['ParameterCode'].toString(),
          patientID: patient.patientId,
          patientTypeID: patient.patientType,
          priority: (_activePriority + 1).toString(),
          roomID: patient.roomId,
          selectedClinicID: _selectedClinic['ClinicID'].toString(),
          selectedDoctorID: _selectedDoctor['DoctorID'].toString(),
          projectID: patient.projectId);
      // TODO: Add Translation
      DrAppToastMsg.showSuccesToast('Reply Successfully');
      Navigator.pop(context);
    } catch (e) {
      DrAppToastMsg.showErrorToast(e);
    }
  }

  bool validation() {
    setState(() {
      isValid = !_extController.value.text.isNullOrEmpty() &&
          !_remarksController.value.text.isNullOrEmpty() &&
          _selectedClinic != null &&
          _selectedDoctor != null &&
          _selectedFrequency != null;
    });
    return isValid;
  }

  InputDecoration textFieldSelectorDecoration(
      String hintText, String selectedText, bool isDropDown) {
    return InputDecoration(
      focusedBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      enabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      disabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      hintText: selectedText != null ? selectedText : hintText,
      suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
      hintStyle: TextStyle(
        fontSize: 14,
        color: Colors.grey.shade600,
      ),
    );
  }

  BoxDecoration containerBorderDecoration(
      Color containerColor, Color borderColor) {
    return BoxDecoration(
      color: containerColor,
      shape: BoxShape.rectangle,
      borderRadius: BorderRadius.all(Radius.circular(6)),
      border: Border.fromBorderSide(BorderSide(
        color: borderColor,
        width: 2.0,
      )),
    );
  }
}
