import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:doctor/patient_dashboard/BP/bp_calculator.dart';
import 'package:doctor/common/settings.dart';
import 'package:doctor/models/bp_history_model.dart';
import 'package:flutter_slidable/flutter_slidable.dart';

class BPHistory extends StatefulWidget {
  String? customerId;
  BPHistory({this.customerId});

  @override
  State<BPHistory> createState() => _BPHistoryState();
}

class _BPHistoryState extends State<BPHistory> {
  bool isLoading = false;
  List<BPHistoryModel> BpHistoryList = [];
  List<BPHistoryModel> FilteredList = [];
  var dateItems = [
    'All',
    'last 7 days',
    'last one month',
    'last one year',
  ];
  var dateItemsVariable = 'All';

  Future<void> getBPHistoryDetails(var selectedRange) async {
    isLoading = true;
    var response1 = await AppSettings.getBPHistory(widget.customerId);
    print(response1);
    setState(() {
      BpHistoryList = ((jsonDecode(response1)) as List).map((dynamic model) {
        return BPHistoryModel.fromJson(model);
      }).toList();

      var now = new DateTime.now();
      var now_1w = now.subtract(Duration(days: 7));
      var now_1m = new DateTime(now.year, now.month - 1, now.day);
      var now_1y = new DateTime(now.year - 1, now.month, now.day);

      if (selectedRange.toString().toUpperCase() == 'LAST 7 DAYS') {
        FilteredList = BpHistoryList.where((product) {
          final date = product.dateForFilter;
          return now_1w.isBefore(date);
        }).toList();
      } else if (selectedRange.toString().toUpperCase() == 'LAST ONE MONTH') {
        FilteredList = BpHistoryList.where((product) {
          final date = product.dateForFilter;
          return now_1m.isBefore(date);
        }).toList();
      } else if (selectedRange.toString().toUpperCase() == 'LAST ONE YEAR') {
        FilteredList = BpHistoryList.where((product) {
          final date = product.dateForFilter;
          return now_1y.isBefore(date);
        }).toList();
      } else {
        FilteredList = BpHistoryList;
      }

      isLoading = false;
    });
  }

  @override
  void initState() {
    getBPHistoryDetails(dateItemsVariable);
    super.initState();
  }

  deleteBpRecord(bpId) async {
    AppSettings.preLoaderDialog(context);
    bool status = await AppSettings.deleteBPDetails(bpId,widget.customerId);

    if (status) {
      Navigator.of(context, rootNavigator: true).pop();

      AppSettings.longSuccessToast("BP record deleted successfully");
      await getBPHistoryDetails(dateItemsVariable);
    } else {
      Navigator.of(context, rootNavigator: true).pop();

      AppSettings.longFailedToast("BP record deletion failed");
    }
  }

  Widget renderzUi() {
    if (FilteredList.length != 0) {
      FilteredList.sort((a, b) => b.actualDate.compareTo(a.actualDate));
      return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
        Padding(
          padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
          child: DropdownButtonFormField(
            // Initial Value
            value: dateItemsVariable,
            isExpanded: true,
            decoration: const InputDecoration(
              prefixIcon: Icon(
                Icons.calendar_month,
                color: primaryColor,
              ),
              border: OutlineInputBorder(
                  borderSide: BorderSide(color: primaryColor)),
              focusedBorder: OutlineInputBorder(
                borderSide: BorderSide(color: primaryColor),
              ),
              enabledBorder: OutlineInputBorder(
                borderSide: BorderSide(color: primaryColor),
              ),
              labelText: 'Select Date Range',
              labelStyle: TextStyle(
                color: greyColor, //<-- SEE HERE
              ),
            ),

            hint: Text('Units'),
            // Down Arrow Icon
            //icon: const Icon(Icons.keyboard_arrow_down),

            // Array list of items
            items: dateItems.map((String items) {
              return DropdownMenuItem(
                  value: items,
                  child: Text(
                    items,
                    style: TextStyle(
                      fontSize: 16,
                    ),
                    textAlign: TextAlign.center,
                  ));
            }).toList(),
            // After selecting the desired option,it will
            // change button value to selected value
            onChanged: (String? newValue) {
              setState(() {
                dateItemsVariable = newValue!;
              });
              getBPHistoryDetails(dateItemsVariable);
            },
          ),
        ),
        IconButton(
          onPressed: () {
           /* Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => Bpchart()),
            );*/
            // showBMIAdddialog();
          },
          icon: Icon(
            Icons.auto_graph,
            color: primaryColor,
          ),
        ),
        Expanded(
            child: ListView.builder(
                padding: EdgeInsets.all(0),
                itemCount: FilteredList.length,
                itemBuilder: (BuildContext context, int index) {
                  return Slidable(
                      key: const ValueKey(0),
                      endActionPane: ActionPane(
                        // A motion is a widget used to control how the pane animates.
                        motion: ScrollMotion(),

                        dragDismissible: false,
                        // A pane can dismiss the Slidable.
                        dismissible: DismissiblePane(onDismissed: () {
                          deleteBpRecord(FilteredList[index].bpId);
                        }),

                        // All actions are defined in the children parameter.
                        children: [
                          // A SlidableAction can have an icon and/or a label.
                          SlidableAction(
                            backgroundColor: Color(0xFFFE4A49),
                            foregroundColor: Colors.white,
                            icon: Icons.delete,
                            label: 'Delete',
                            onPressed: (BuildContext context) {
                              deleteBpRecord(FilteredList[index].bpId);
                            },
                          ),
                        ],
                      ),
                      child: Card(
                        color: Colors.white,
                        child: Padding(
                          padding: EdgeInsets.all(8),
                          child: Container(
                            //width: MediaQuery.of(context).size.width * .55,
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.start,
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Row(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    /* Image(
                                        image: const AssetImage('images/height.png'),
                                        height: 25,
                                        width: 25,
                                        fit: BoxFit.fill),*/
                                    Text(
                                      'Systolic',
                                      style: TextStyle(color: primaryColor),
                                    ),
                                    SizedBox(
                                      width: 5,
                                    ),
                                    Padding(
                                      padding: EdgeInsets.all(1),
                                      child: Text(
                                          FilteredList[index]
                                              .systolic
                                              .toString()
                                              .toUpperCase(),
                                          style: valuesTextStyle()),
                                    )
                                  ],
                                ),
                                Row(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    Text(
                                      'Diastolic',
                                      style: TextStyle(color: primaryColor),
                                    ),
                                    Padding(
                                      padding: EdgeInsets.all(1),
                                      child: Text(
                                          FilteredList[index]
                                              .diastolic
                                              .toString()
                                              .toUpperCase(),
                                          style: valuesTextStyle()),
                                    )
                                  ],
                                ),
                                Row(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    Image(
                                        image: const AssetImage(
                                            'images/height.png'),
                                        height: 25,
                                        width: 25,
                                        fit: BoxFit.fill),
                                    Padding(
                                      padding: EdgeInsets.all(5),
                                      child: Text(
                                          FilteredList[index]
                                              .bpText
                                              .toString()
                                              .toUpperCase(),
                                          style: valuesTextStyle()),
                                    )
                                  ],
                                ),
                                Row(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    Image(
                                        image:
                                            const AssetImage('images/date.png'),
                                        height: 25,
                                        width: 25,
                                        fit: BoxFit.fill),
                                    Padding(
                                      padding: EdgeInsets.all(5),
                                      child: Text(
                                          FilteredList[index]
                                              .actualDate
                                              .toString()
                                              .toUpperCase(),
                                          style: valuesTextStyle()),
                                    )
                                  ],
                                ),
                              ],
                            ),
                          ),
                        ),
                      ));
                })),
      ]);
    } else {
      return Center(
          child: Padding(
        padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            SizedBox(
              height: MediaQuery.of(context).size.height * .25,
            ),
            Text('No data'),
            SizedBox(
              height: 20,
            ),
            CircleAvatar(
              backgroundColor: primaryColor,
              radius: 40,
              child: IconButton(
                iconSize: 40,
                icon: const Icon(
                  Icons.add,
                  color: Colors.white,
                ),
                onPressed: () async {
                  Navigator.push(context, MaterialPageRoute(builder: (context) => BPCalculator(customerId: widget.customerId,))).then((value) {
                    getBPHistoryDetails(dateItemsVariable);
                  });
                },
              ),
            )
          ],
        ),
      ));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppSettings.appBar('Blood Pressure'),
      body: isLoading
          ? Center(
              child: CircularProgressIndicator(
                color: primaryColor,
                strokeWidth: 5.0,
              ),
            )
          : renderzUi(),
      floatingActionButton: Visibility(
        visible:FilteredList.length!=0,
        child: CircleAvatar(
          backgroundColor: buttonColors,
          radius: 40,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              IconButton(
                iconSize: 40,
                icon: const Icon(
                  Icons.add,
                  color: Colors.black,
                ),
                onPressed: () async {
                  Navigator.push(context, MaterialPageRoute(builder: (context) => BPCalculator(customerId: widget.customerId,))).then((value) {
                    getBPHistoryDetails(dateItemsVariable);
                  });
                },
              ),
              /* Padding(
                      padding: EdgeInsets.fromLTRB(5, 0, 5, 5),
                      child: Text(
                        'Add Tanks ',
                        style: TextStyle(color: Colors.white),
                      ),
                    )*/
            ],
          ),
        ),
      ),
    );
  }
}
