import 'package:doctor_app_flutter/core/enum/filter_type.dart';
import 'package:doctor_app_flutter/core/enum/view_state.dart';
import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
import 'package:doctor_app_flutter/core/viewModel/PatientSearchViewModel.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update/shared_soap_widgets/bottom_sheet_title.dart';
import 'package:doctor_app_flutter/utils/date-utils.dart';
import 'package:doctor_app_flutter/utils/utils.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';

import '../../../config/config.dart';

class FilterDatePage extends StatefulWidget {
  final OutPatientFilterType outPatientFilterType;
  final PatientSearchViewModel patientSearchViewModel;

  const FilterDatePage({Key? key, required this.outPatientFilterType, required this.patientSearchViewModel}) : super(key: key);

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

class _FilterDatePageState extends State<FilterDatePage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    var screenSize;
    return AppScaffold(
        isShowAppBar: false,
        backgroundColor: Theme.of(context).scaffoldBackgroundColor,
        body: SingleChildScrollView(
          child: Container(
            height: MediaQuery.of(context).size.height * 1.0,
            child: Padding(
              padding: EdgeInsets.all(0.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  BottomSheetTitle(
                    title: (OutPatientFilterType.Previous == widget.outPatientFilterType) ? " Filter Previous Out Patient" : "Filter Nextweek Out Patient",
                  ),
                  SizedBox(
                    height: 10.0,
                  ),
                  Center(
                    child: FractionallySizedBox(
                      widthFactor: 0.9,
                      child: Column(
                        children: [
                          Container(
                            color: Colors.white,
                            child: InkWell(
                              onTap: () => selectDate(context, firstDate: getFirstDate(widget.outPatientFilterType), lastDate: getLastDate(widget.outPatientFilterType)),
                              child: TextField(
                                decoration: textFieldSelectorDecoration(
                                    TranslationBase.of(context).fromDate,
                                    widget.patientSearchViewModel.selectedFromDate != null
                                        ? "${AppDateUtils.convertStringToDateFormat(widget.patientSearchViewModel.selectedFromDate.toString(), "yyyy-MM-dd")}"
                                        : "",
                                    true,
                                    suffixIcon: Icon(
                                      Icons.calendar_today,
                                      color: Colors.black,
                                    )),
                                enabled: false,
                              ),
                            ),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          Container(
                            color: Colors.white,
                            child: InkWell(
                              onTap: () => selectDate(context, isFromDate: false, firstDate: getFirstDate(widget.outPatientFilterType), lastDate: getLastDate(widget.outPatientFilterType)),
                              child: TextField(
                                decoration: textFieldSelectorDecoration(
                                    TranslationBase.of(context).toDate,
                                    widget.patientSearchViewModel.selectedToDate != null
                                        ? "${AppDateUtils.convertStringToDateFormat(widget.patientSearchViewModel.selectedToDate.toString(), "yyyy-MM-dd")}"
                                        : "",
                                    true,
                                    suffixIcon: Icon(
                                      Icons.calendar_today,
                                      color: Colors.black,
                                    )),
                                enabled: false,
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
        bottomSheet: Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.all(
              Radius.circular(0.0),
            ),
            border: Border.all(color: HexColor('#707070'), width: 0),
          ),
          height: MediaQuery.of(context).size.height * 0.1,
          width: double.infinity,
          child: Column(
            children: [
              SizedBox(
                height: 10,
              ),
              Container(
                child: FractionallySizedBox(
                  widthFactor: .80,
                  child: Center(
                    child: AppButton(
                      title: TranslationBase.of(context).search,
                      padding: 10,
                      color: AppGlobal.appGreenColor,
                      onPressed: () async {
                        if (widget.patientSearchViewModel.selectedFromDate == null || widget.patientSearchViewModel.selectedToDate == null) {
                          Utils.showErrorToast("Please Select All The date Fields ");
                        } else {
                          Duration difference = widget.patientSearchViewModel.selectedToDate!.difference(widget.patientSearchViewModel.selectedFromDate!);
                          if (difference.inDays > 90) {
                            Utils.showErrorToast("The difference between from date and end date must be less than 3 months");
                          } else {
                            String dateTo = AppDateUtils.convertDateToFormat(widget.patientSearchViewModel.selectedToDate!, 'yyyy-MM-dd');
                            String dateFrom = AppDateUtils.convertDateToFormat(widget.patientSearchViewModel.selectedFromDate!, 'yyyy-MM-dd');

                            PatientSearchRequestModel currentModel = PatientSearchRequestModel();

                            currentModel.to = dateTo;
                            currentModel.from = dateFrom;
                            GifLoaderDialogUtils.showMyDialog(context);
                            await widget.patientSearchViewModel.getOutPatient(currentModel, isLocalBusy: true);
                            GifLoaderDialogUtils.hideDialog(context);
                            if (widget.patientSearchViewModel.state == ViewState.ErrorLocal) {
                              Utils.showErrorToast(widget.patientSearchViewModel.error);
                            } else {
                              Navigator.of(context).pop();
                            }
                          }
                        }
                      },
                    ),
                  ),
                ),
              ),
              SizedBox(
                height: 5,
              ),
            ],
          ),
        ));
  }

  selectDate(BuildContext context, {bool isFromDate = true, DateTime? firstDate, lastDate}) async {
    Utils.hideKeyboard(context);
    DateTime selectedDate = isFromDate ? this.widget.patientSearchViewModel.selectedFromDate ?? firstDate : this.widget.patientSearchViewModel.selectedToDate ?? lastDate;
    final DateTime? picked = await showDatePicker(
      context: context,
      initialDate: selectedDate,
      firstDate: firstDate!,
      lastDate: lastDate,
      initialEntryMode: DatePickerEntryMode.calendar,
    );
    if (picked != null) {
      if (isFromDate) {
        setState(() {
          this.widget.patientSearchViewModel.selectedFromDate = picked;
          var date = picked.add(Duration(days: 30));
          if (date.isBefore(lastDate)) {
            this.widget.patientSearchViewModel.selectedToDate = date;
          } else
            this.widget.patientSearchViewModel.selectedToDate = lastDate;
        });
      } else {
        setState(() {
          this.widget.patientSearchViewModel.selectedToDate = picked;
        });
      }
    }
  }

  getFirstDate(OutPatientFilterType outPatientFilterType) {
    if (outPatientFilterType == OutPatientFilterType.Previous) {
      return DateTime(DateTime.now().year - 20, DateTime.now().month, DateTime.now().day);
    } else {
      return DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1);
    }
  }

  getLastDate(OutPatientFilterType outPatientFilterType) {
    if (outPatientFilterType == OutPatientFilterType.Previous) {
      return DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day - 1);
    } else {
      return DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 7);
    }
  }

  InputDecoration textFieldSelectorDecoration(String hintText, String selectedText, bool isDropDown, {Icon? suffixIcon}) {
    return InputDecoration(
      focusedBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      enabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFEFEFEF), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      disabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFEFEFEF), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      hintText: selectedText != null ? selectedText : hintText,
      suffixIcon: isDropDown
          ? suffixIcon != null
              ? suffixIcon
              : Icon(
                  Icons.keyboard_arrow_down_sharp,
                  color: Color(0xff2E303A),
                )
          : null,
      hintStyle: TextStyle(
        fontSize: 13,
        color: Color(0xff2E303A),
        fontFamily: 'Poppins',
        fontWeight: FontWeight.w600,
      ),
      labelText: selectedText != null ? '$hintText\n$selectedText' : null,
      labelStyle: TextStyle(
        fontSize: 13,
        color: Color(0xff2E303A),
        fontFamily: 'Poppins',
        fontWeight: FontWeight.w600,
      ),
    );
  }
}
