import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:glossy/glossy.dart';
import 'package:go_router/go_router.dart';
import 'package:gap/gap.dart';
import 'package:pharmacy_mobile/auth/auth_service.dart';
import 'package:pharmacy_mobile/widgets/buttonwithprogress_widget.dart';
import 'package:pharmacy_mobile/widgets/glossy_container_widget.dart';
import 'package:pharmacy_mobile/widgets/input_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class LoginPage extends StatefulWidget {
  const LoginPage({super.key});

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final _authService = AuthService();
  final _emailController = TextEditingController();
  final _passwordController = TextEditingController();
  final FocusNode _focusNode = FocusNode();

  late bool _isLoading = false;
  late double containerHeight = 0.35;

  void _signIn() async {
    final email = _emailController.text;
    final password = _passwordController.text;

    if (email.isEmpty) {
      if (mounted) {
        showNotification(context, 'Error: Please enter a valid email', false);
      }
      return;
    }

    if (password.isEmpty) {
      if (mounted) {
        showNotification(context, 'Error: Please enter a password', false);
      }
      return;
    }

    setState(() {
      _isLoading = true;
      containerHeight = 0.365;
    });

    try {
      if (await InternetConnectionChecker.instance.hasConnection) {
        await _authService.signIn(email, password);

        if (mounted) {
          final user = _authService.getCurrentUser();

          if (user != null) {
            showNotification(context, 'Login Successful', true);

            WidgetsBinding.instance.addPostFrameCallback((_) {
              if (user.contains('admin')) {
                if (mounted) context.push('/main');
              } else {
                if (mounted) context.push('/customer');
              }
            });
          }
        }
      } else {
        if (mounted) {
          showNotification(context, 'Error: No Internet Connection', false);
        }
      }
    } catch (e) {
      if (e is AuthException) {
        final errorMessage = e.message;

        if (mounted) {
          if (errorMessage == 'Invalid login credentials') {
            showNotification(context, 'Error: Invalid Email or Password', false);
          }
        }
      }
    } finally {
      setState(() {
        _isLoading = false;
        containerHeight = 0.35;
      });
    }
  }

  @override
  void dispose() {
    _emailController.dispose();
    _passwordController.dispose();
    _focusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        resizeToAvoidBottomInset: false,
        body: PageBackgroundWidget(
          page: 'login',
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                const Gap(96),
                const TitleWidget(
                  firstTextSize: 14,
                  secondTextSize: 24,
                  logoSize: 90,
                ),
                const Gap(32),
                const TextWidget(
                  text: 'Login',
                  title: true,
                ),
                const Gap(16),
                Padding(
                  padding: const EdgeInsets.only(left: 32, right: 32),
                  child: GlossyContainerWidget(
                    height: containerHeight,
                    child: Form(
                        child: Column(
                      children: [
                        InputWidget(label: 'Email', controller: _emailController),
                        const Gap(16),
                        KeyboardListener(
                          focusNode: _focusNode,
                          onKeyEvent: (event) {
                            if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.enter) {
                              _signIn();
                            }
                          },
                          child: InputWidget(
                            label: 'Password',
                            controller: _passwordController,
                            password: true,
                          ),
                        ),
                        const Gap(40),
                        ButtonWithProgressWidget(
                            trigger: _isLoading, progressText: 'Logging In', buttonText: 'Login', onPressed: _signIn)
                      ],
                    )),
                  ),
                ),
                const Gap(16),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    const TextWidget(
                      text: "Don't have an account?",
                      size: 14,
                    ),
                    const Gap(8),
                    GestureDetector(
                      onTap: () => {context.push('/register')},
                      child: const TextWidget(
                        text: 'Register here',
                        size: 14,
                        underlined: true,
                      ),
                    )
                  ],
                )
              ],
            ),
          ),
        ));
  }
}
