import 'package:doctor_app_flutter/config/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/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.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/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.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/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

class ObjectivePage extends StatefulWidget {
  final Function changePageViewIndex;
  final List<MySelectedExamination> mySelectedExamination;

  ObjectivePage(
      {Key key, this.changePageViewIndex, this.mySelectedExamination});

  @override
  _ObjectivePageState createState() => _ObjectivePageState();
}

class _ObjectivePageState extends State<ObjectivePage> {
  bool isSysExaminationExpand = false;
  TextEditingController remarksController = TextEditingController();

  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: 0.5,
      )),
    );
  }
  @override
  Widget build(BuildContext context) {
    final screenSize = MediaQuery.of(context).size;

    return AppScaffold(
        isShowAppBar: false,
        body: SingleChildScrollView(
          physics: ScrollPhysics(),
          child: Center(
            child: FractionallySizedBox(
              widthFactor: 0.9,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: [
                  SizedBox(
                    height: 30,
                  ),
                  HeaderBodyExpandableNotifier(
                    headerWidget: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        Row(
                          children: [
                            Texts('Physical/System Examination',
                                variant:
                                    isSysExaminationExpand ? "bodyText" : '',
                                bold: isSysExaminationExpand ? true : false,
                                color: Colors.black),
                            Icon(
                              FontAwesomeIcons.asterisk,
                              color: AppGlobal.appPrimaryColor,
                              size: 12,
                            )
                          ],
                        ),
                        InkWell(
                            onTap: () {
                              setState(() {
                                isSysExaminationExpand =
                                    !isSysExaminationExpand;
                              });
                            },
                            child: Icon(isSysExaminationExpand
                                ? EvaIcons.minus
                                : EvaIcons.plus))
                      ],
                    ),
                    bodyWidget: Column(children: [
                      SizedBox(
                        height: 20,
                      ),
                      Column(
                        children: [
                          Container(
                            margin:
                                EdgeInsets.only(left: 10, right: 10, top: 15),
                            child: TextFields(
                                hintText: "Add Examination",
                                fontSize: 13.5,
                                onTapTextFields: () {
                                  openExaminationList(context);
                                },
                                readOnly: true,
                                // hintColor: Colors.black,
                                suffixIcon: EvaIcons.plusCircleOutline,
                                suffixIconColor: AppGlobal.appPrimaryColor,
                                fontWeight: FontWeight.w600,
                                // controller: messageController,
                                validator: (value) {
                                  if (value == null)
                                    return TranslationBase.of(context)
                                        .emptyMessage;
                                  else
                                    return null;
                                }),
                          ),
                          SizedBox(
                            height: 20,
                          ),
                          Column(
                            children:
                                widget.mySelectedExamination.map((examination) {
                              return Container(
                                  margin: EdgeInsets.only(
                                      left: 15, right: 15, top: 15),
                                  child: Column(children: [
                                    Row(
                                      mainAxisAlignment:
                                          MainAxisAlignment.spaceBetween,
                                      children: [
                                        Texts(
                                            examination
                                                .selectedExamination.nameEn
                                                .toUpperCase(),
                                            variant: "bodyText",
                                            bold: true,
                                            color: Colors.black)
                                      ],
                                    ),
                                    SizedBox(
                                      height: 8,
                                    ),
                                    Row(
                                      mainAxisAlignment:
                                          MainAxisAlignment.spaceBetween,
                                      children: [
                                        Row(
                                          children: [
                                            InkWell(
                                                child: Center(
                                                  child: Container(
                                                      height:
                                                          screenSize.height *
                                                              0.070,
                                                      decoration:
                                                          containerBorderDecoration(
                                                              Colors.white,
                                                              Colors.grey),
                                                      child: Center(
                                                        child: Padding(
                                                          padding:
                                                              const EdgeInsets
                                                                  .all(8.0),
                                                          child: Text(
                                                            "Normal",
                                                            style: TextStyle(
                                                              fontSize: 12,
                                                              color:
                                                                  Colors.black,
                                                              //Colors.black,
                                                              fontWeight:
                                                                  FontWeight
                                                                      .bold,
                                                            ),
                                                          ),
                                                        ),
                                                      )),
                                                ),
                                                onTap: () {}),
                                            SizedBox(
                                              width: 12,
                                            ),
                                            InkWell(
                                                child: Center(
                                                  child: Container(
                                                      height:
                                                          screenSize.height *
                                                              0.070,
                                                      decoration:
                                                          containerBorderDecoration(
                                                              Color(0xFF515A5D),
                                                              Colors.black),
                                                      child: Center(
                                                        child: Padding(
                                                          padding:
                                                              const EdgeInsets
                                                                  .all(8.0),
                                                          child: Text(
                                                            "Abnormal",
                                                            style: TextStyle(
                                                              fontSize: 12,
                                                              color:
                                                                  Colors.white,
                                                              //Colors.black,
                                                              fontWeight:
                                                                  FontWeight
                                                                      .bold,
                                                            ),
                                                          ),
                                                        ),
                                                      )),
                                                ),
                                                onTap: () {}),
                                          ],
                                        ),
                                        InkWell(

                                          child: Icon(
                                            FontAwesomeIcons.trash,
                                            color: Colors.grey,
                                            size: 20,
                                          ),
                                          onTap: () => removeExamination(
                                              examination.selectedExamination),
                                        )
                                      ],
                                    ),
                                    SizedBox(
                                      height: 20,
                                    ),
                                    Container(
                                      margin: EdgeInsets.only(
                                          left: 10, right: 10, top: 15),
                                      child: TextFields(
                                          hintText: "Remarks",
                                          fontSize: 13.5,
                                          // hintColor: Colors.black,
                                          fontWeight: FontWeight.w600,
                                          maxLines: 25,
                                          minLines: 13,
                                          controller: remarksController,
                                          validator: (value) {
                                            if (value == null)
                                              return TranslationBase.of(context)
                                                  .emptyMessage;
                                            else
                                              return null;
                                          }),
                                    ),
                                    SizedBox(
                                      height: 20,
                                    ),
                                  ]));
                            }).toList(),
                          )
                        ],
                      )
                    ]),
                    isExpand: isSysExaminationExpand,
                  ),
                  DividerWithSpacesAround(height: 30,),
                  AppButton(
                    title: TranslationBase.of(context).next,
                    onPressed: () {
                      widget.changePageViewIndex(2);
                    },
                  ),
                  SizedBox(
                    height: 30,
                  ),
                ],
              ),
            ),
          ),
        ));
  }

  removeExamination(MasterKeyModel masterKey) {
    Iterable<MySelectedExamination> history = widget.mySelectedExamination
        .where(
            (element) =>
        masterKey.id == element.selectedExamination.id &&
            masterKey.typeId == element.selectedExamination.typeId);

    if (history.length > 0)
      setState(() {
        widget.mySelectedExamination.remove(history.first);
      });
  }

  openExaminationList(BuildContext context) {
    final screenSize = MediaQuery
        .of(context)
        .size;
    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,
        ),
      );
    }

    showModalBottomSheet(
        backgroundColor: Colors.white,
        isScrollControlled: true,
        context: context,
        builder: (context) {
          return AddExaminationDailog(
            mySelectedExamination: widget.mySelectedExamination,
            addSelectedExamination: () {
              setState(() {
                Navigator.of(context).pop();
              });
            },
            removeExamination: (masterKey) => removeExamination(masterKey),);
        });
  }
}

class AddExaminationDailog extends StatefulWidget {
  final List<MySelectedExamination> mySelectedExamination;
  final Function addSelectedExamination;
  final Function (MasterKeyModel) removeExamination;

  const AddExaminationDailog(
      {Key key, this.mySelectedExamination, this.addSelectedExamination, this.removeExamination})
      : super(key: key);

  @override
  _AddExaminationDailogState createState() => _AddExaminationDailogState();
}

class _AddExaminationDailogState extends State<AddExaminationDailog> {
  @override
  Widget build(BuildContext context) {
    return FractionallySizedBox(
      heightFactor: 0.7,
      child: BaseView<SOAPViewModel>(
          onModelReady: (model) async {
            if (model.physicalExaminationList.length == 0) {
              await model.getMasterLookup(
                  MasterKeysService.PhysicalExamination);
            }
          },
          builder: (_, model, w) =>
              AppScaffold(
                // baseViewModel: model,
                isShowAppBar: false,
                body: Center(
                    child: Container(
                        child: FractionallySizedBox(
                          widthFactor: 0.9,
                          child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                SizedBox(
                                  height: 16,
                                ),
                                AppText(
                                  "Examinations",
                                  fontWeight: FontWeight.bold,
                                  fontSize: 16,
                                ),
                                SizedBox(
                                  height: 16,
                                ),
                                NetworkBaseView(
                                  baseViewModel: model,
                                  child: Container(
                                    height:
                                    MediaQuery
                                        .of(context)
                                        .size
                                        .height * 0.5,
                                    child: Center(
                                        child: Container(
                                          margin: EdgeInsets.only(top: 15),
                                          decoration: BoxDecoration(
                                              borderRadius: BorderRadius
                                                  .circular(12),
                                              color: Colors.white),
                                          child: ListView(
                                            children: [
                                              Column(
                                                children: model
                                                    .physicalExaminationList
                                                    .map((examinationInfo) {
                                                  return Column(
                                                    children: [
                                                      Row(
                                                        children: [
                                                          Checkbox(
                                                              value: isServiceSelected(
                                                                  examinationInfo),
                                                              activeColor:
                                                              Colors.red[800],
                                                              onChanged:
                                                                  (
                                                                  bool newValue) {
                                                                setState(() {
                                                                  if (isServiceSelected(
                                                                      examinationInfo
                                                                  )) {
                                                                    widget
                                                                        .removeExamination(
                                                                        examinationInfo
                                                                    );
                                                                  }
                                                                  else {
                                                                    MySelectedExamination mySelectedExamination = new MySelectedExamination(
                                                                        selectedExamination: examinationInfo
                                                                    );
                                                                    widget
                                                                        .mySelectedExamination
                                                                        .add(
                                                                        mySelectedExamination);
                                                                  }
                                                                });
                                                              }),
                                                          Expanded(
                                                            child: Padding(
                                                              padding:
                                                              const EdgeInsets
                                                                  .symmetric(
                                                                  horizontal: 10,
                                                                  vertical: 0),
                                                              child: Texts(
                                                                  examinationInfo
                                                                      .nameEn,
                                                                  variant: "bodyText",
                                                                  bold: true,
                                                                  color:
                                                                  Colors.black),
                                                            ),
                                                          ),
                                                        ],
                                                      ),
                                                      DividerWithSpacesAround(),
                                                    ],
                                                  );
                                                }).toList(),
                                              ),
                                            ],
                                          ),
                                        )),
                                  ),
                                ),
                                SizedBox(
                                  height: 10,
                                ),
                                if (model.state == ViewState.Idle)
                                  AppButton(
                                    title: "Add SELECTED  Examinations"
                                        .toUpperCase(),
                                    onPressed: () {
                                      widget.addSelectedExamination();
                                    },
                                  ),
                              ]),
                        ))),
              )),
    );
  }

  isServiceSelected(MasterKeyModel masterKey) {
    Iterable<MySelectedExamination> exam =
    widget
        .mySelectedExamination
        .where((element) =>
    masterKey.id == element.selectedExamination.id &&
        masterKey.typeId == element.selectedExamination.typeId);
    if (exam.length > 0) {
      return true;
    }
    return false;
  }
}
