import 'package:aitrainer_app/bloc/login_form_bloc.dart';
import 'package:aitrainer_app/bloc/account/account_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/util/common.dart';
import 'package:aitrainer_app/widgets/splash.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:flutter_form_bloc/flutter_form_bloc.dart';

import '../library_keys.dart';

class LoginPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return LoginWidget();
  }
}

class LoginWidget extends StatefulWidget {
  LoginWidget();

  @override
  State<StatefulWidget> createState() => _LoginWidget();
}

class _LoginWidget extends State<LoginWidget> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    final accountBloc = BlocProvider.of<AccountBloc>(context);
    return BlocProvider(
        create: (context) => LoginFormBloc(
          userRepository: UserRepository(),
          accountBloc: accountBloc
        ),
        child: Builder(builder: (context) {
          final loginBloc = BlocProvider.of<LoginFormBloc>(context);
          return Scaffold(
            key: _scaffoldKey,
            body: FormBlocListener<LoginFormBloc, String, String>(
              onSubmitting: (context, state) {
                LoadingDialog.show(context);
              },
              onSuccess: (context, state) {
                LoadingDialog.hide(context);
                Navigator.of(context).pushNamed('home');
              },
              onFailure: (context, state) {
                LoadingDialog.hide(context);
                showInSnackBar(state.failureResponse);
              },
              child: Container(
                decoration: BoxDecoration(
                  image: DecorationImage(
                    image: AssetImage('asset/image/WT_login.png'),
                    fit: BoxFit.cover,
                    //height: double.infinity,
                    //width: double.infinity,
                    alignment: Alignment.center,
                  ),
                ),
                child: buildLoginForm(loginBloc, accountBloc),
              ),
            ),
          );
        }));
  }

  Widget buildLoginForm(LoginFormBloc formBloc, AccountBloc accountBloc) {
    final cWidth = Common.mediaSizeWidth(context);

    return Form(
      key: _formKey,
      child: Container(
          padding: const EdgeInsets.only(left: 25, right: 100),
          child:
              ListView(shrinkWrap: false, padding: EdgeInsets.only(top: 120.0),
                  children: <Widget>[
                FlatButton(
                  child: new Image.asset(
                    'asset/image/login_fb.png',
                    width: cWidth * .85,
                  ),
                  onPressed: () => {
                    _fbLogin(),
                    print("Login with FB"),
                  },
                ),
                Text(AppLocalizations.of(context).translate("OR")),
                Divider(),
                Row(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: [
                    new InkWell(
                      child: new Text(
                          AppLocalizations.of(context).translate('Login'),
                          style: TextStyle(
                              fontWeight: FontWeight.bold, fontSize: 24)),
                    ),
                  ],
                ),
                Divider(),
                TextFieldBlocBuilder(
                  key: LibraryKeys.loginEmailField,
                  textFieldBloc: formBloc.emailField,
                  decoration: InputDecoration(
                    fillColor: Colors.white,
                    filled: true,
                    labelText: 'Email',
                  ),
                ),
                Divider(
                  color: Colors.transparent,
                ),
                TextFieldBlocBuilder(
                  key: LibraryKeys.loginPasswordField,
                  textFieldBloc: formBloc.passwordField,
                  decoration: InputDecoration(
                    fillColor: Colors.white,
                    filled: true,
                    labelText: 'Password',
                  ),
                  suffixButton: SuffixButton.obscureText,
                ),
                Divider(
                  color: Colors.transparent,
                ),
                Row(
                    mainAxisAlignment: MainAxisAlignment.end,
                    children: <Widget>[
                      new FlatButton(
                          key: LibraryKeys.loginOKButton,
                          child: Image.asset('asset/image/WT_OK.png',
                              width: 100, height: 100),
                          onPressed: () => {
                            formBloc.add(SubmitFormBloc())
                          }),
                    ]),
                Divider(
                  color: Colors.transparent,
                ),
                Row(
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    children: <Widget>[
                      new InkWell(
                        child: new Text(
                            AppLocalizations.of(context).translate('SignUp')),
                        onTap: () =>
                            Navigator.of(context).pushNamed('registration'),
                      ),
                      Spacer(flex: 1),
                      new InkWell(
                        child: new Text(
                            AppLocalizations.of(context).translate('Privacy')),
                        onTap: () => Navigator.of(context).pushNamed('gdpr'),
                      ),
                      Spacer(flex: 2),
                    ]),
              ])),
    );
  }


  void showInSnackBar(String error) {
    _scaffoldKey.currentState.showSnackBar(SnackBar(
      backgroundColor: Colors.orange,
      content: Text(error, style: TextStyle(color: Colors.white))));
  }

 Future<Null> _fbLogin() async {
    final FacebookLogin facebookSignIn = new FacebookLogin();
    final FacebookLoginResult result = await facebookSignIn.logIn(['email']);

    switch (result.status) {
      case FacebookLoginStatus.loggedIn:
        final FacebookAccessToken accessToken = result.accessToken;
        showInSnackBar('''
         Logged in!
         
         Token: ${accessToken.token}
         User id: ${accessToken.userId}
         Expires: ${accessToken.expires}
         Permissions: ${accessToken.permissions}
         Declined permissions: ${accessToken.declinedPermissions}
         ''');
        break;
      case FacebookLoginStatus.cancelledByUser:
        showInSnackBar('Login cancelled by the user.');
        break;
      case FacebookLoginStatus.error:
        showInSnackBar('Something went wrong with the login process.\n'
            'Here\'s the error Facebook gave us: ${result.errorMessage}');
        break;
    }
  }
}