// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/widgets.dart';
import 'package:provider/provider.dart';

import '../service/google_authentication.dart';
import 'sign_in_button/sign_in_button.dart';

enum _SignInButtonAction { logout }

/// Widget for displaying sign in information for the current user.
///
/// If logged in, it will display the user's avatar. Clicking it opens a dropdown for logging out.
/// Otherwise, a sign in button will show.
class UserSignIn extends StatelessWidget {
  const UserSignIn({
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    final GoogleSignInService authService = Provider.of<GoogleSignInService>(context);

    // Listen to the changes of `authService` to re-render.
    return AnimatedBuilder(
      animation: authService,
      builder: (BuildContext context, _) {
        if (authService.user != null) {
          return PopupMenuButton<_SignInButtonAction>(
            offset: const Offset(0, 50),
            itemBuilder: (BuildContext context) => <PopupMenuEntry<_SignInButtonAction>>[
              const PopupMenuItem<_SignInButtonAction>(
                value: _SignInButtonAction.logout,
                child: Text('Log out'),
              ),
            ],
            onSelected: (_SignInButtonAction value) {
              switch (value) {
                case _SignInButtonAction.logout:
                  authService.signOut();
                  break;
              }
            },
            iconSize: Scaffold.of(context).appBarMaxHeight,
            icon: Builder(
              builder: (BuildContext context) {
                if (!kIsWeb && Platform.environment.containsKey('FLUTTER_TEST')) {
                  return Padding(
                    padding: const EdgeInsets.only(right: 10.0, top: 20.0),
                    child: Text(authService.user!.email),
                  );
                }
                return GoogleUserCircleAvatar(
                  identity: authService.user!,
                );
              },
            ),
          );
        }
        return const SignInButton();
      },
    );
  }
}
