// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:form_bloc_example/app/metadata.dart';
import 'package:form_bloc_example/constants.dart';
import 'package:form_bloc_example/simple_custom_form_cubit/simple_custom_form_cubit.dart';
import 'package:form_bloc_example/sign_up/sign_up_page.dart';
import 'package:wyatt_form_bloc/wyatt_form_bloc.dart';

const blue = Metadata(category: Category.perso);
const red = Metadata(category: Category.business);

class App extends StatelessWidget {
  const App({Key? key}) : super(key: key);

  static List<FormInput> getNormalEntries() {
    return [
      FormInput(formFieldName, const Name.pure('Test'),
          metadata: const FormInputMetadata<Metadata>(extra: blue)),
      FormInput(formFieldEmail, const Email.pure(),
          metadata: const FormInputMetadata<Metadata>(extra: blue)),
      FormInput(
          formFieldList, const ListOption<String>.pure(choices: ['c1', 'c2', 'c3'],defaultValue: 'c3')),
      FormInput(formFieldRadio, const TextString.pure()),
      FormInput(formFieldPro, const Boolean.pure(),
          metadata: const FormInputMetadata<Metadata>(name: 'business')),
      FormInput(formFieldHidden, const Boolean.pure(),
          metadata:
              const FormInputMetadata<Metadata>(export: false, extra: blue)),
    ];
  }

  static List<FormInput> getBusinessEntries() {
    final entries = [
      FormInput(formFieldPhone, const Phone.pure(),
          metadata: const FormInputMetadata<Metadata>(extra: red)),
    ];
    return getNormalEntries() + entries;
  }

  static WyattForm getNormalFormData() {
    return WyattFormImpl(getNormalEntries(), name: formSignUp);
  }

  static WyattForm getProFormData() {
    return WyattFormImpl(getBusinessEntries(), name: formSignUp);
  }

  @override
  Widget build(BuildContext context) {
    FormRepository formRepository = FormRepositoryImpl()
      ..registerForm(getNormalFormData());
    
    // FormRepository formRepository = FormRepositoryImpl()
    //   ..registerForm(WyattFormImpl([
    //     FormInput(formFieldName, const Name.pure('Test'),
    //         metadata: const FormInputMetadata<Metadata>(extra: blue)),
    //   ], name: formSignUp));

    SimpleCustomFormCubit formCubit = SimpleCustomFormCubit(
      formRepository,
      formSignUp,
    );

    return RepositoryProvider<FormRepository>.value(
      value: formRepository,
      child: BlocProvider<SimpleCustomFormCubit>(
        create: (context) => formCubit,
        child: const WidgetTree(),
      ),
    );
  }
}

class WidgetTree extends StatelessWidget {
  const WidgetTree({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        buttonTheme: const ButtonThemeData(
          buttonColor: Colors.blue,
          textTheme: ButtonTextTheme.primary,
        ),
      ),
      home: const SignUpPage(),
    );
  }
}
