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/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
import 'package:flutter/material.dart';

import 'add_examination_widget.dart';

class ExaminationsListSearchWidget extends StatefulWidget {
  final Function(MasterKeyModel) removeHistory;
  final Function(MySelectedExamination) addHistory;
  final bool Function(MasterKeyModel) isServiceSelected;
  final List<MasterKeyModel> masterList;

  ExaminationsListSearchWidget(
      {this.removeHistory,
      this.addHistory,
      this.isServiceSelected,
      this.masterList});

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

class _ExaminationsListSearchWidgetState
    extends State<ExaminationsListSearchWidget> {
  int expandedIndex = -1;
  List<MasterKeyModel> items = List();
  TextEditingController filteredSearchController = TextEditingController();

  @override
  void initState() {
    items.addAll(widget.masterList);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        AppTextFieldCustom(
          height: MediaQuery.of(context).size.height * 0.080,
          hintText: TranslationBase.of(context).searchExamination,
          isTextFieldHasSuffix: true,
          hasBorder: false,
          controller: filteredSearchController,
          onChanged: (value) {
            filterSearchResults(value);
          },
          suffixIcon: IconButton(
              icon: Icon(
            Icons.search,
            color: Colors.black,
          )),
        ),
        DividerWithSpacesAround(
          height: 2,
        ),
        ...items.mapIndexed((index, item) {
          return AddExaminationWidget(
            item: item,
            addHistory: widget.addHistory,
            removeHistory: widget.removeHistory,
            isServiceSelected: widget.isServiceSelected,
            isExpand: index == expandedIndex,
            expandClick: () {
              setState(() {
                if (expandedIndex == index) {
                  expandedIndex = -1;
                } else {
                  expandedIndex = index;
                }
              });
            },
          );
        }).toList(),
      ],
    );
  }

  void filterSearchResults(String query) {
    List<MasterKeyModel> dummySearchList = List();
    dummySearchList.addAll(widget.masterList);
    if (query.isNotEmpty) {
      List<MasterKeyModel> dummyListData = List();
      dummySearchList.forEach((item) {
        if (item.nameAr.toLowerCase().contains(query.toLowerCase()) ||
            item.nameEn.toLowerCase().contains(query.toLowerCase())) {
          dummyListData.add(item);
        }
      });
      setState(() {
        items.clear();
        items.addAll(dummyListData);
      });
      return;
    } else {
      setState(() {
        items.clear();
        items.addAll(widget.masterList);
      });
    }
  }
}

extension FicListExtension<T> on List<T> {
  /// Maps each element of the list.
  /// The [map] function gets both the original [item] and its [index].
  Iterable<E> mapIndexed<E>(E Function(int index, T item) map) sync* {
    for (var index = 0; index < length; index++) {
      yield map(index, this[index]);
    }
  }
}
