import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:hive/hive.dart';
import '../../models/form_builder.dart';
import '../../models/user.dart';
import 'form_builder_text_field.dart';

class FormBuilderComponent extends StatefulWidget {
  final bool lockTextFields;

  const FormBuilderComponent({Key? key, required this.lockTextFields})
      : super(key: key);

  @override
  State<FormBuilderComponent> createState() => _FormBuilderComponentState();
}

class _FormBuilderComponentState extends State<FormBuilderComponent> {
  final formKey = GlobalKey<FormBuilderState>();

  final List<FormTextField> listOfTextField = [
    FormTextField(
        "vorname",
        TextInputType.text,
        30,
        "Der Vorname sollte maximal 30 Zeichen lang sein",
        "Der Vorname sollte mindestens 2 Zeichen lang sein",
        2,
        null,
        null,
        null,
        null),
    FormTextField(
        "nachname",
        TextInputType.text,
        30,
        "Der Nachname sollte maximal 30 Zeichen lang sein",
        "Der Nachname sollte mindestens 2 Zeichen lang sein",
        2,
        null,
        null,
        null,
        null),
    FormTextField(
        "gewicht",
        TextInputType.number,
        null,
        null,
        null,
        null,
        200,
        10,
        "Der Gewicht sollte maximal 200 kg sein",
        "Der Gewicht sollte mindestens 10 kg sein"),
    FormTextField(
        "groesse",
        TextInputType.number,
        null,
        null,
        null,
        null,
        230,
        60,
        "Die Größe sollte maximal 230cm sein",
        "Die Größe sollte mindestens 60cm sein"),
    FormTextField(
        "alter",
        TextInputType.number,
        null,
        null,
        null,
        null,
        99,
        6,
        "Das Alter sollte maximal 99 Jahre alt sein",
        "Das Alter sollte mindestens 6 Jahre alt sein"),
    FormTextField(
        "kalorien",
        TextInputType.number,
        null,
        null,
        null,
        null,
        30000,
        1000,
        "Die Kalorienanzahl sollte mindestens 30000 Kcal sein",
        "Die Kalorienanzahl sollte mindestens 1000 Kcal sein")
  ];

  @override
  Widget build(BuildContext context) {
    return FormBuilder(
        key: formKey,
        child: Padding(
          padding: const EdgeInsets.all(8),
          child: SingleChildScrollView(
              child: Column(
            children: [
              ListView.builder(
                  primary: false,
                  itemCount: listOfTextField.length,
                  shrinkWrap: true,
                  itemBuilder: (context, index) {
                    return FormBuilderTextFieldComponent(
                        widget.lockTextFields, listOfTextField[index]);
                  }),
              Container(
                  margin:
                      const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
                  width: double.infinity,
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(
                      minimumSize: const Size.fromHeight(40), //
                      backgroundColor: CupertinoColors.systemGreen,
                      foregroundColor: const Color(0xFFffffff),
                      shape: const StadiumBorder(),
                    ),
                    onPressed: () {
                      final Box box = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');

                      if (widget.lockTextFields) {
                        box.put(
                            "USER",
                            User(
                                formKey.currentState?.fields['vorname']
                                        ?.value ??
                                    box.get("USER").vorname.toString(),
                                formKey.currentState?.fields['nachname']
                                        ?.value ??
                                    box.get("USER").nachname.toString(),
                                int.parse(formKey.currentState?.fields['gewicht']
                                    ?.value ??
                                    box.get("USER").gewicht),
                                int.parse(formKey.currentState?.fields['groesse']
                                    ?.value ??
                                    box.get("USER").groesse),
                                int.parse(formKey.currentState?.fields['alter']?.value ??
                                    box.get("USER").alter),
                                int.parse(formKey.currentState?.fields['kalorien']
                                    ?.value ??
                                    box.get("USER").kalorien)));

                        ScaffoldMessenger.of(context)
                            .showSnackBar(const SnackBar(
                          duration: Duration(seconds: 2),
                          content: Text('Die Daten wurden erfolgreich gespeichert'),
                        ));
                      } else {
                        box.put(
                            "USER",
                            User(
                                formKey.currentState?.fields['vorname']?.value,
                                formKey.currentState?.fields['nachname']?.value,
                                int.parse(formKey.currentState?.fields['gewicht']?.value),
                                int.parse(formKey.currentState?.fields['groesse']?.value),
                                int.parse(formKey.currentState?.fields['alter']?.value),
                                int.parse(formKey.currentState?.fields['kalorien']?.value)
                            ));
                      }
                      Future.delayed(
                          const Duration(seconds: 2),
                              () => Navigator.of(context)
                                  .pushNamedAndRemoveUntil('/navigation', (Route<dynamic> route)
                              => false)
                      );
                    },
                    child: const Text("Eingaben bestätigen"),
                  )),
            ],
          )),
        ));
  }
}
