import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart';

import 'package:diplomaticquarterapp/pages/MyAppointments/models/DoctorScheduleResponse.dart';
import 'package:diplomaticquarterapp/pages/MyAppointments/widgets/indicator.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/medical_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';

class SchedulePage extends StatefulWidget {
  final DoctorList doctorList;
  final AppoitmentAllHistoryResultList appo;
  SchedulePage({
    this.appo,
    this.doctorList,
  });
  @override
  _SchedulePageState createState() => _SchedulePageState();
}

class _SchedulePageState extends State<SchedulePage> {
  DoctorsListService service;
  PageController _pageController = PageController();
  double currentPage = 0;
  int selectedindex = 0;
  List weeks = [];
  List<DoctorScheduleResponse> doctorScheduleResponse = [];
  int weekMS = 604800 * 1000;
  DoctorList doctorList;
  List<String> freeSlots = [];
  bool isPageChange = false;

  AppSharedPreferences sharedPref = AppSharedPreferences();
  @override
  void initState() {
    this.doctorList = widget.doctorList;

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BaseView<MedicalViewModel>(
        onModelReady: (model) => model.getDoctorSchedule(doctorList),
        builder: (_, model, widget) => BaseView<MedicalViewModel>(
            onModelReady: (model2) => model2.getFreeSlots(doctorList),
            builder: (_, model2, widget2) {
              if (model.freeSlots.length > 0 && isPageChange == false) {
                this.freeSlots = model.freeSlots;
                this.doctorScheduleResponse = model.getDoctorScheduleList;

                this.generateWeeksSchedules();
              }
              return AppScaffold(
                  appBarTitle: TranslationBase.of(context).schedule,
                  isShowAppBar: true,
                  baseViewModel: model2,
                  body: SizedBox(
                      height: MediaQuery.of(context).size.height,
                      child: Stack(
                        children: [
                          Container(
                              margin: EdgeInsets.only(top: 40),
                              child: PageView.builder(
                                controller: _pageController,
                                itemCount: weeks.length,
                                onPageChanged: (index) {
                                  setState(() {
                                    isPageChange = true;
                                    this.currentPage = index.toDouble();
                                  });
                                },
                                itemBuilder: (context, index) {
                                  return Container(
                                      child: ListView.builder(
                                          itemCount: weeks[index].length,
                                          itemBuilder: (context, index2) =>
                                              InkWell(
                                                  onTap: () {
                                                    openBookAppointment(
                                                        weeks[index][index2]);
                                                  },
                                                  child: Row(
                                                    children: [
                                                      Expanded(
                                                        flex: 1,
                                                        child: Padding(
                                                            padding:
                                                                EdgeInsets.only(
                                                                    left: 20),
                                                            child: Row(
                                                                children: [
                                                                  Column(
                                                                    children: [
                                                                      Texts(
                                                                        weeks[index][index2]
                                                                            [
                                                                            'DayName'],
                                                                        fontSize:
                                                                            13,
                                                                      ),
                                                                      Texts(
                                                                        getDayMonths(
                                                                          DateUtil
                                                                              .convertStringToDate(
                                                                            weeks[index][index2]['Date'],
                                                                          ),
                                                                        ),
                                                                        fontWeight:
                                                                            FontWeight.bold,
                                                                        fontSize:
                                                                            18,
                                                                      )
                                                                    ],
                                                                  )
                                                                ])),
                                                      ),
                                                      Expanded(
                                                        flex: 3,
                                                        child: ClipRRect(
                                                            borderRadius:
                                                                const BorderRadius
                                                                        .all(
                                                                    Radius.circular(
                                                                        20.0)),
                                                            child: Container(
                                                                padding:
                                                                    EdgeInsets.only(
                                                                        left:
                                                                            10,
                                                                        right:
                                                                            10,
                                                                        top: 20,
                                                                        bottom:
                                                                            20),
                                                                margin: EdgeInsets.only(
                                                                    left: 20,
                                                                    right: 20,
                                                                    top: 7,
                                                                    bottom: 7),
                                                                decoration: BoxDecoration(
                                                                    boxShadow: [
                                                                      weeks[index][index2]['fullDay'] ==
                                                                              false
                                                                          ? BoxShadow(
                                                                              color: Colors.green,
                                                                              offset: Offset(-5, 0))
                                                                          : BoxShadow(),
                                                                    ],
                                                                    borderRadius:
                                                                        const BorderRadius.all(Radius.circular(
                                                                            10.0)),
                                                                    color: Colors
                                                                        .white),
                                                                child: Row(
                                                                  children: [
                                                                    Expanded(
                                                                      child:
                                                                          Texts(
                                                                        weeks[index][index2]
                                                                            [
                                                                            'WorkingHours'],
                                                                        fontWeight:
                                                                            FontWeight.w400,
                                                                      ),
                                                                    )
                                                                  ],
                                                                ))),
                                                      )
                                                    ],
                                                  ))));
                                },
                              )),
                          PageViewIndicator(
                            isActive: true,
                            currentPage: this.currentPage,
                            length: weeks.length,
                          )
                        ],
                      )));
            }));
  }

  generateWeeksSchedules() {
    this.weeks.clear();
    for (var i = 0; i < 8; i++) {
      var weekSchedule = generateNewWeekSchedule(i);
      this.markWeekFreeDays(weekSchedule);
      this.weeks.add(weekSchedule);
    }
    //print(this.weeks);
  }

  markWeekFreeDays(schedule) {
    for (var workDay in schedule) {
      workDay['fullDay'] = !this.hasFreeSlot(workDay['Date']);
    }
  }

  generateNewWeekSchedule(weekIndex) {
    var weekMSOffset = weekIndex * weekMS;

    var newWeekSchedule = [];
    for (var workDay in this.doctorScheduleResponse) {
      Map<String, dynamic> newWorkDay = Map();
      newWorkDay['Date'] = DateUtil.convertDateMSToJsonDate(
          DateUtil.convertStringToDate(workDay.date).millisecondsSinceEpoch +
              weekMSOffset);
      newWorkDay['DayName'] = workDay.dayName;
      newWorkDay['WorkingHours'] = workDay.workingHours;
      newWeekSchedule.add(newWorkDay);
    }
    return newWeekSchedule;
  }

  hasFreeSlot(String jsonDate) {
    var date = DateUtil.convertStringToDate(jsonDate);
    var scheduleDay = date;
    for (var event in this.freeSlots) {
      var date = DateUtil.convertStringToDate(event);
      var nDate = DateTime(date.year, date.month, date.day);

      if (nDate.millisecondsSinceEpoch == scheduleDay.millisecondsSinceEpoch) {
        return true;
      }
    }
    return false;
  }

  String getDayMonths(DateTime dateTime) {
    String dateFormat =
        '${dateTime.day} ${DateUtil.getMonth(dateTime.month).toString().substring(0, 3)}';
    return dateFormat;
  }

  openBookAppointment(selectedDate) {
    //sharedPref.setObject(DOCTOR_SCHEDULE_DATE_SEL, selectedDate);
    Navigator.push(
      context,
      FadePage(
        page: AppointmentDetails(
          appo: widget.appo,
          doctorSchedule: selectedDate,
        ),
      ),
    );
  }
}
