import 'package:farm_tpf/custom_model/Device.dart';
import 'package:farm_tpf/custom_model/SuppliesUsing.dart';
import 'package:farm_tpf/custom_model/Supply.dart';
import 'package:farm_tpf/presentation/custom_widgets/WidgetErrorTextField.dart';
import 'package:farm_tpf/presentation/custom_widgets/widget_text_form_field.dart';
import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart';
import 'package:farm_tpf/presentation/screens/actions/controller/ChangeDevice.dart';
import 'package:farm_tpf/presentation/screens/actions/controller/ChangeFieldInForm.dart';
import 'package:farm_tpf/presentation/screens/actions/controller/ChangeFormButton.dart';
import 'package:farm_tpf/presentation/screens/actions/controller/ChangeSupplyUsing.dart';
import 'package:farm_tpf/presentation/screens/actions/controller/ChangeUnit.dart';
import 'package:farm_tpf/presentation/screens/actions/resource_device_activity/sc_device_activity.dart';
import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_supply.dart';
import 'package:farm_tpf/presentation/screens/resources/sc_resource_helper.dart';
import 'package:farm_tpf/utils/const_common.dart';
import 'package:farm_tpf/utils/const_string.dart';
import 'package:farm_tpf/utils/const_style.dart';
import 'package:farm_tpf/utils/validators.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:farm_tpf/utils/formatter.dart';

import '../util_action.dart';

class WidgetHarvestProcessSupply extends StatefulWidget {
  final List<SuppliesUsing>? currentItems;
  final Function(List<SuppliesUsing> supplyChanges) onChangeSupplies;
  WidgetHarvestProcessSupply({
    this.currentItems,
    required this.onChangeSupplies,
  });
  @override
  _WidgetHarvestProcessSupplyState createState() => _WidgetHarvestProcessSupplyState();
}

class _WidgetHarvestProcessSupplyState extends State<WidgetHarvestProcessSupply> {
  final _dosageController = TextEditingController();
  final _quantityController = TextEditingController();
  final _howToUseController = TextEditingController();
  final changeSelectedSupply = Get.put(ChangeSupply());
  final changeSupplyUsing = Get.put(ChangeSupplyUsing());
  final changeUnit = Get.put(ChangeUnit());
  final changeButton = Get.put(ChangeButtonInForm());
  final changeSelectedDevice = Get.put(ChangeDevice());
  final changeFormField = Get.put(ChangeFieldFormSupply());
  GlobalKey<FormState> _formSupplyKey = GlobalKey();

  @override
  void initState() {
    super.initState();
    changeSelectedSupply.initValue();
    changeSelectedDevice.initValue();
    changeSupplyUsing.init(widget.currentItems ?? []);
    changeUnit.initValue();
    changeButton.resetValue();
    changeFormField.init();
  }

  Widget _buildListSupply() {
    return GetBuilder<ChangeSupplyUsing>(
        init: changeSupplyUsing,
        builder: (value) {
          widget.onChangeSupplies(value.currentItems ?? []);
          if (value.currentItems!.isEmpty) {
            return Container();
          } else {
            return Container(
                height: 120,
                child: ListView.builder(
                    physics: ClampingScrollPhysics(),
                    scrollDirection: Axis.horizontal,
                    shrinkWrap: true,
                    itemCount: value.currentItems?.length ?? 0,
                    itemBuilder: (context, index) {
                      return GestureDetector(
                          onTap: () {
                            print("edit");
                            changeSupplyUsing.changeIndexEdit(index);
                            changeButton.updateToEdit(true);
                            var editedSupplyUsing = value.currentItems![index];
                            var editedSupply = Supply()
                              ..id = editedSupplyUsing.tbSuppliesInWarehouseId
                              ..tbSuppliesName = editedSupplyUsing.supplyName
                              ..unit = editedSupplyUsing.supplyUnit;
                            changeSelectedSupply.change(editedSupply);

                            var editedDevice = Device()
                              ..id = editedSupplyUsing.tbEquipmentOfCustomerId
                              ..name = editedSupplyUsing.equipmentName;
                            changeSelectedDevice.change(editedDevice);

                            changeUnit.updateListByUnitName(editedSupplyUsing.supplyUnit ?? '');
                            changeUnit.updateSelected(editedSupplyUsing.supplyUnit ?? '');
                            _dosageController.text = editedSupplyUsing.dosage ?? '';
                            _howToUseController.text = editedSupplyUsing.howToUse ?? '';
                            _quantityController.text = editedSupplyUsing.quantity?.formatNumtoStringDecimal() ?? '0';
                          },
                          child: Card(
                              child: Stack(
                            alignment: Alignment.bottomCenter,
                            children: <Widget>[
                              Positioned(
                                  child: ClipRRect(
                                borderRadius: BorderRadius.circular(8),
                                child: Container(
                                  padding: EdgeInsets.all(4),
                                  width: 150,
                                  child: Column(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    children: [
                                      SizedBox(
                                        height: 12.0,
                                      ),
                                      Flexible(
                                        child: Text(value.currentItems?[index].supplyName ?? "", overflow: TextOverflow.ellipsis, maxLines: 1),
                                      ),
                                      Validators.stringNotNullOrEmpty(value.currentItems?[index].dosage ?? '')
                                          ? Flexible(child: Text("${value.currentItems?[index].dosage ?? ""}"))
                                          : SizedBox(),
                                      Validators.stringNotNullOrEmpty(value.currentItems?[index].quantity?.formatNumtoStringDecimal() ?? '')
                                          ? Flexible(
                                              child: Text(
                                              "${value.currentItems?[index].quantity?.formatNumtoStringDecimal() ?? ""} ${value.currentItems?[index].supplyUnit ?? ""}",
                                            ))
                                          : SizedBox(),
                                      Validators.stringNotNullOrEmpty(value.currentItems?[index].equipmentName ?? '')
                                          ? Flexible(child: Text("${value.currentItems?[index].equipmentName ?? ""}"))
                                          : SizedBox(),
                                      Validators.stringNotNullOrEmpty(value.currentItems?[index].howToUse ?? '')
                                          ? Flexible(child: Text("${value.currentItems?[index].howToUse ?? ""}"))
                                          : SizedBox(),
                                    ],
                                  ),
                                ),
                              )),
                              Positioned(
                                top: -10,
                                right: -10,
                                child: IconButton(
                                    icon: Icon(
                                      Icons.cancel,
                                      color: Colors.redAccent,
                                    ),
                                    onPressed: () {
                                      changeSupplyUsing.deleteSupply(index);
                                    }),
                              )
                            ],
                          )));
                    }));
          }
        });
  }

  Widget _btnSelectSubstrates() {
    return GetBuilder<ChangeSupply>(
        init: changeSelectedSupply,
        builder: (data) {
          return TextButton(
              onPressed: () {
                var currentIndexEdit = changeSupplyUsing.currentIndex;
                Navigator.of(context)
                    .push(MaterialPageRoute(
                        builder: (_) => ResourceHelperScreen(
                              titleName: "Hoá chất xử lý",
                              type: ConstCommon.supplyTypeAll,
                              selectedId: changeSelectedSupply.selectedSupplyId ?? -1,
                              currentItems: changeSupplyUsing.currentItems ?? [],
                              currentEditId: ((currentIndexEdit ?? -1) >= 0)
                                  ? (changeSupplyUsing.currentItems?[(currentIndexEdit ?? 0)].tbSuppliesInWarehouseId ?? -1)
                                  : -1,
                            ),
                        fullscreenDialog: false))
                    .then((value) {
                  if (value != null) {
                    var result = value as Supply;
                    changeSelectedSupply.change(result);
                    changeUnit.updateListByUnitName(result.unit ?? '');
                    changeFormField.change(true);
                  }
                });
              },
              child: GetBuilder<ChangeSupply>(
                  init: changeSelectedSupply,
                  builder: (_) {
                    var isValid = changeSelectedSupply.isValid;
                    return Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Container(
                            padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),
                            decoration: BoxDecoration(
                              border: Border(bottom: BorderSide(width: 1, color: (isValid ?? false) ? Colors.grey : Colors.red)),
                            ),
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Text(
                                  'Hoá chất xử lý *',
                                  style: TextStyle(
                                      fontSize: 13, fontWeight: FontWeight.normal, color: (isValid ?? false) ? Colors.black54 : Colors.red[600]),
                                ),
                                Row(
                                  children: [
                                    Expanded(
                                        child: Text(changeSelectedSupply.selectedSupplyName ?? "Hoá chất xử lý",
                                            style: TextStyle(fontSize: 14.0, color: Colors.black87))),
                                    Icon(
                                      Icons.arrow_drop_down,
                                      color: Colors.grey,
                                    ),
                                  ],
                                ),
                              ],
                            )),
                        (isValid ?? false) ? SizedBox() : WidgetErrorTextField()
                      ],
                    );
                  }));
        });
  }

  Widget _btnSelectDevice() {
    return GetBuilder<ChangeDevice>(
        init: changeSelectedDevice,
        builder: (data) {
          return TextButton(
              onPressed: () {
                Navigator.of(context)
                    .push(
                  MaterialPageRoute(
                      builder: (_) => ListDeviceActivity(selectedId: changeSelectedDevice.selectedDeviceId ?? -1), fullscreenDialog: false),
                )
                    .then((value) {
                  if (value != null) {
                    var result = value as Device;
                    changeSelectedDevice.change(result);
                    changeFormField.change(true);
                  }
                });
              },
              child: Container(
                  padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),
                  decoration: BoxDecoration(
                    border: kBorderTextField,
                  ),
                  child: Row(
                    children: [
                      GetBuilder<ChangeSupply>(
                          init: changeSelectedSupply,
                          builder: (_) => Expanded(
                              child: Text(changeSelectedDevice.selectedDeviceName ?? "Thiết bị",
                                  style: TextStyle(fontSize: 14.0, color: Colors.black87)))),
                      Icon(
                        Icons.arrow_drop_down,
                        color: Colors.grey,
                      ),
                    ],
                  )));
        });
  }

  Widget _dropdownUnitTypes() {
    return GetBuilder<ChangeUnit>(
        init: changeUnit,
        builder: (data) {
          return DropdownButtonFormField<String>(
            itemHeight: 100,
            value: (data.selectedUnit ?? '').isEmpty ? null : data.selectedUnit,
            items: (data.currentUnits ?? [])
                .map((label) => DropdownMenuItem(
                      child: Text(label),
                      value: label,
                    ))
                .toList(),
            onChanged: (value) {
              var currentQuantity = _quantityController.text;
              num assignValue = currentQuantity.parseDoubleThousand();
              if (assignValue != null) {
                var oldSelected = data.selectedUnit;
                if (oldSelected == value) {
                } else {
                  assignValue = UtilAction.convertUnit(inputValue: assignValue, oldUnit: oldSelected ?? '', newUnit: value ?? '');
                }
                _quantityController.text = assignValue.formatNumtoStringDecimal();
              }
              changeUnit.updateSelected(value ?? '');
            },
          );
        });
  }

  _quantityField() {
    return WidgetTextFormFieldNumber(
      hintValue: "Tổng lượng sử dụng *",
      labelText: "Tổng lượng sử dụng *",
      textController: _quantityController,
      validator: (String? value) {
        return Validators.validateNotNullOrEmpty(value ?? '', label_validate_input_empty);
      },
      onChanged: (value) {
        if (!Validators.stringNotNullOrEmpty(value ?? '') &&
            !Validators.stringNotNullOrEmpty(_howToUseController.text) &&
            !Validators.stringNotNullOrEmpty(_dosageController.text) &&
            (Get.find<ChangeSupply>().selectedSupplyId ?? -1) <= 0 &&
            (changeSelectedDevice.selectedDeviceId ?? -1) <= 0) {
          changeFormField.change(false);
        } else {
          changeFormField.change(true);
        }
      },
    );
  }

  _buttonInForm() {
    return GetBuilder<ChangeButtonInForm>(
        init: changeButton,
        builder: (_) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              _.isEdit ?? false
                  ? TextButton(
                      child: Text("Huỷ"),
                      onPressed: () {
                        changeButton.resetValue();
                        _resetForm();
                        _hidenKeyboard(context);
                      })
                  : SizedBox(),
              _.isEdit ?? false
                  ? Expanded(
                      child: TextButton(
                          onPressed: () {
                            if (_formSupplyKey.currentState!.validate()) {
                              _formSupplyKey.currentState!.save();
                              if ((changeSelectedSupply.selectedSupplyId ?? -1) <= 0) {
                                changeSelectedSupply.changeValid(false);
                              } else {
                                changeSelectedSupply.changeValid(true);
                              }
                              var currentSupply = changeSelectedSupply.currentSupply;
                              var currentDevice = changeSelectedDevice.currentDevice;
                              var currentQuantity = _quantityController.text.parseDoubleThousand();
                              if (currentSupply?.id != null && (currentQuantity ?? 0) > 0) {
                                var quantityWithCurrentSupplyUnit = UtilAction.convertUnit(
                                  inputValue: currentQuantity,
                                  oldUnit: changeUnit.selectedUnit ?? '',
                                  newUnit: changeSelectedSupply.currentSupply?.unit ?? '',
                                );
                                SuppliesUsing newSup = SuppliesUsing()
                                  ..dosage = _dosageController.text
                                  ..howToUse = _howToUseController.text
                                  ..quantity = quantityWithCurrentSupplyUnit
                                  ..tbSuppliesInWarehouseId = currentSupply?.id
                                  ..suppliesInWarehouseId = currentSupply?.id
                                  ..supplyName = currentSupply?.tbSuppliesName
                                  ..tbEquipmentOfCustomerId = currentDevice?.id ?? -1
                                  ..equipmentOfCustomerId = currentDevice?.id ?? -1
                                  ..equipmentName = currentDevice?.name ?? ''
                                  ..supplyUnit = currentSupply?.unit
                                  ..unit = currentSupply?.unit;
                                changeSupplyUsing.editSupply(changeSupplyUsing.currentIndex ?? -1, newSup);
                                _resetForm();
                                _hidenKeyboard(context);
                              } else if (currentSupply?.id == null || ((currentQuantity ?? 0) <= 0)) {
                                Utils.showSnackBarWarning(message: "Vui lòng nhập vật tư và số lượng");
                              }
                            } else {
                              Utils.showSnackBarWarning(message: "Vui lòng nhập vật tư và số lượng");
                              if ((changeSelectedSupply.selectedSupplyId ?? -1) <= 0) {
                                changeSelectedSupply.changeValid(false);
                              } else {
                                changeSelectedSupply.changeValid(true);
                              }
                            }
                          },
                          child: Text(
                            "Sửa hoá chất xử lý",
                            style: TextStyle(color: Colors.blue),
                          )),
                    )
                  : Expanded(
                      child: TextButton(
                          onPressed: () {
                            if (_formSupplyKey.currentState!.validate()) {
                              _formSupplyKey.currentState!.save();
                              if ((changeSelectedSupply.selectedSupplyId ?? -1) <= 0) {
                                changeSelectedSupply.changeValid(false);
                              } else {
                                changeSelectedSupply.changeValid(true);
                              }
                              var currentSupply = changeSelectedSupply.currentSupply;
                              var currentDevice = changeSelectedDevice.currentDevice;
                              var currentQuantity = _quantityController.text.parseDoubleThousand();
                              if (currentSupply?.id != null && (currentQuantity ?? 0) > 0) {
                                var quantityWithCurrentSupplyUnit = UtilAction.convertUnit(
                                  inputValue: currentQuantity,
                                  oldUnit: changeUnit.selectedUnit ?? '',
                                  newUnit: changeSelectedSupply.currentSupply?.unit ?? '',
                                );
                                SuppliesUsing newSup = SuppliesUsing()
                                  ..dosage = _dosageController.text
                                  ..howToUse = _howToUseController.text
                                  ..quantity = quantityWithCurrentSupplyUnit
                                  ..tbSuppliesInWarehouseId = currentSupply?.id
                                  ..suppliesInWarehouseId = currentSupply?.id
                                  ..supplyName = currentSupply?.tbSuppliesName
                                  ..supplyUnit = currentSupply?.unit
                                  ..tbEquipmentOfCustomerId = currentDevice?.id ?? -1
                                  ..equipmentOfCustomerId = currentDevice?.id ?? -1
                                  ..equipmentName = currentDevice?.name ?? ''
                                  ..unit = currentSupply?.unit;
                                changeSupplyUsing.addSupply(newSup);
                                _resetForm();
                                _hidenKeyboard(context);
                              } else if (currentSupply?.id == null || ((currentQuantity ?? 0) <= 0)) {
                                Utils.showSnackBarWarning(message: "Vui lòng nhập vật tư và số lượng");
                              }
                            } else {
                              Utils.showSnackBarWarning(message: "Vui lòng nhập vật tư và số lượng");
                              if ((changeSelectedSupply.selectedSupplyId ?? -1) <= 0) {
                                changeSelectedSupply.changeValid(false);
                              } else {
                                changeSelectedSupply.changeValid(true);
                              }
                            }
                          },
                          child: Text(
                            "+ Thêm hoá chất xử lý",
                            style: TextStyle(color: Colors.blue),
                          )),
                    )
            ],
          );
        });
  }

  Widget _formEdit() {
    return Form(
      key: _formSupplyKey,
      child: Column(
        children: [
          Container(
            padding: EdgeInsets.all(8.0),
            margin: EdgeInsets.all(8.0),
            decoration: BoxDecoration(
              shape: BoxShape.rectangle,
              borderRadius: BorderRadius.circular(10),
              color: Colors.white,
              border: Border.all(
                color: Colors.grey,
              ),
            ),
            child: Column(
              children: [
                _btnSelectSubstrates(),
                TextFormField(
                  keyboardType: TextInputType.text,
                  controller: _dosageController,
                  decoration: InputDecoration(labelText: "Liều lượng sử dụng"),
                  onSaved: (newValue) {},
                  onChanged: (value) {
                    if (!Validators.stringNotNullOrEmpty(_quantityController.text) &&
                        !Validators.stringNotNullOrEmpty(_howToUseController.text) &&
                        !Validators.stringNotNullOrEmpty(value) &&
                        (Get.find<ChangeSupply>().selectedSupplyId ?? -1) <= 0 &&
                        (changeSelectedDevice.selectedDeviceId ?? -1) <= 0) {
                      changeFormField.change(false);
                    } else {
                      changeFormField.change(true);
                    }
                  },
                ),
                Row(
                    mainAxisSize: MainAxisSize.min,
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Expanded(
                        flex: 2,
                        child: Container(
                          height: 82,
                          child: _quantityField(),
                        ),
                      ),
                      SizedBox(
                        width: 16.0,
                      ),
                      Expanded(
                          flex: 1,
                          child: Align(
                            alignment: Alignment.bottomCenter,
                            child: _dropdownUnitTypes(),
                          )),
                    ]),
                Container(
                  width: double.infinity,
                  child: Text(
                    "Thiết bị",
                    style: TextStyle(color: Colors.black54, fontSize: 13.0),
                  ),
                ),
                _btnSelectDevice(),
                TextFormField(
                  keyboardType: TextInputType.text,
                  controller: _howToUseController,
                  decoration: InputDecoration(labelText: "Phương pháp sử dụng"),
                  onSaved: (newValue) {},
                  onChanged: (value) {
                    if (!Validators.stringNotNullOrEmpty(_quantityController.text) &&
                        !Validators.stringNotNullOrEmpty(value) &&
                        !Validators.stringNotNullOrEmpty(_dosageController.text) &&
                        (Get.find<ChangeSupply>().selectedSupplyId ?? -1) <= 0 &&
                        (changeSelectedDevice.selectedDeviceId ?? -1) <= 0) {
                      changeFormField.change(false);
                    } else {
                      changeFormField.change(true);
                    }
                  },
                ),
              ],
            ),
          ),
          _buttonInForm()
        ],
      ),
    );
  }

  _resetForm() {
    changeSupplyUsing.changeIndexEdit(-1);
    changeButton.resetValue();
    _dosageController.text = "";
    _howToUseController.text = "";
    _quantityController.text = "";
    changeUnit.initValue();
    changeSelectedSupply.initValue();
    changeSelectedDevice.initValue();
    changeFormField.change(false);
  }

  _hidenKeyboard(BuildContext context) {
    FocusScopeNode currentFocus = FocusScope.of(context);
    if (!currentFocus.hasPrimaryFocus) {
      currentFocus.unfocus();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Align(
            alignment: Alignment.centerLeft,
            child: Text(
              'Hóa chất xử lý',
              style: TextStyle(color: Colors.black54, fontSize: 14),
            ),
          ),
        ),
        _buildListSupply(),
        SizedBox(
          height: 8.0,
        ),
        _formEdit()
      ],
    );
  }
}
