import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../../../../application/auth/auth_bloc.dart';
import '../../../../application/auth/set_password/set_password_form_bloc.dart';
import '../../../../injection.dart';
import '../../../components/button/button.dart';
import '../../../components/field/field.dart';
import '../../../components/toast/flushbar.dart';
import '../../../router/app_router.gr.dart';

@RoutePage()
class CreatePasswordPage extends StatelessWidget implements AutoRouteWrapper {
  final String registrationToken;
  const CreatePasswordPage({super.key, required this.registrationToken});

  @override
  Widget build(BuildContext context) {
    return BlocListener<SetPasswordFormBloc, SetPasswordFormState>(
      listenWhen: (p, c) =>
          p.failureOrSetPasswordOption != c.failureOrSetPasswordOption,
      listener: (context, state) {
        state.failureOrSetPasswordOption.fold(
          () => null,
          (either) => either.fold(
            (f) => AppFlushbar.showAuthFailureToast(context, f),
            (data) {
              AppFlushbar.showSuccess(context, data.message);
              Future.delayed(Duration(milliseconds: 1000), () {
                context.read<AuthBloc>().add(AuthEvent.fetchCurrentUser());
                context.router.replaceAll([MainRoute()]);
              });
            },
          ),
        );
      },
      child: Scaffold(
        appBar: AppBar(title: const Text('Buat Kata Sandi')),
        body: BlocBuilder<SetPasswordFormBloc, SetPasswordFormState>(
          builder: (context, state) {
            return Form(
              autovalidateMode: state.showErrorMessages
                  ? AutovalidateMode.always
                  : AutovalidateMode.disabled,
              child: Padding(
                padding: const EdgeInsets.symmetric(horizontal: 24.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    const SizedBox(height: 40),

                    // Title
                    AppPasswordTextFormField(
                      title: 'Masukkan kata sandi',
                      hintText: '********',
                      onChanged: (value) => context
                          .read<SetPasswordFormBloc>()
                          .add(SetPasswordFormEvent.passwordChanged(value)),
                      validator: (value) {
                        if (context
                            .read<SetPasswordFormBloc>()
                            .state
                            .password
                            .isEmpty) {
                          return 'Masukkan kata sandi';
                        }

                        return null;
                      },
                    ),
                    SizedBox(height: 24),
                    AppPasswordTextFormField(
                      title: 'Ulangi kata sandi',
                      hintText: '********',
                      onChanged: (value) =>
                          context.read<SetPasswordFormBloc>().add(
                            SetPasswordFormEvent.confirmPasswordChanged(value),
                          ),
                      validator: (value) {
                        if (context
                            .read<SetPasswordFormBloc>()
                            .state
                            .password
                            .isEmpty) {
                          return 'Masukkan kata sandi';
                        }

                        if (context
                                .read<SetPasswordFormBloc>()
                                .state
                                .password !=
                            context
                                .read<SetPasswordFormBloc>()
                                .state
                                .confirmPassword) {
                          return 'Kata sandi tidak cocok';
                        }

                        return null;
                      },
                    ),

                    const SizedBox(height: 50),

                    Spacer(),

                    // Continue Button
                    AppElevatedButton(
                      onPressed: state.isSubmitting
                          ? null
                          : () => context.read<SetPasswordFormBloc>().add(
                              SetPasswordFormEvent.submitted(),
                            ),
                      title: 'Konfirmasi',
                      isLoading: state.isSubmitting,
                    ),

                    const SizedBox(height: 24),
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }

  @override
  Widget wrappedRoute(BuildContext context) => BlocProvider(
    create: (context) => getIt<SetPasswordFormBloc>()
      ..add(SetPasswordFormEvent.registrationTokenChanged(registrationToken)),
    child: this,
  );
}
