import 'package:fhub/backend/DataManager.dart';
import 'package:fhub/backend/Dialogs.dart';
import 'package:fhub/backend/login_mgr.dart';
import 'package:fhub/home.dart';
import 'package:fhub/src/CustomWidgets.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';

import 'backend/DebugHelper.dart';

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

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int counter = -1;
  bool loginLoading = false;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    kickstartAnimations();
    init();
  }

  void init() async{
    if(await DataManager.Init() == false){
      return;
    }
    if(await LoginManager.AutoLogin() == 0){
      loadHome();
    }else{
      counter=0;
      setState(() {

      });
    }
  }

  void kickstartAnimations() async {
    await Future.delayed(const Duration(milliseconds: 500));

    setState(() {
      op1 = 1;
      op2 = 1;
      op3 = 1;
    });
  }


  void loadHome(){
    Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
        Home()), (Route<dynamic> route) => false);
  }

  @override
  Widget build(BuildContext context) {
    final screenHeight = MediaQuery
        .of(context)
        .size
        .height;
    final screenWidth = MediaQuery
        .of(context)
        .size
        .width;

    return Scaffold(
        backgroundColor: Colors.black,
        extendBody: true,
        body: CustomBody(
          onAnimEnd: () {
            setState(() {});
          },
          context: context,
          child: CurrentScreen(),
        ));
  }

  Widget CurrentScreen() {
    switch (counter) {
      case -1:
        return Header(child: const Center(child:Text("Loading...")));
        break;
      case 1:
        return LoginPage();
        break;
      default:
        return LandingPage();
        break;
    }
  }

  Widget LandingPage() {
    return Header(child: Container(
      // color: Colors.black12,
      child: Column(

        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          const Padding(
            padding: EdgeInsets.symmetric(horizontal: 80.0),
            child: Text(
              "Start Earning Crypto by playing games",
              style: TextStyle(fontSize: 18),
              textAlign: TextAlign.center,
            ),
          ),
          const SizedBox(height: 100),
          NeonButton(
              onPressed: () {
                setState(() {
                  counter = 1;
                });
              },
              text: "Get Started",
              trailing: const Icon(
                Icons.arrow_circle_right_outlined,
                size: 30,
              )),
          const SizedBox(height: 120),

        ],
      ),
    ),);
  }

  bool isLogin = true;
  TextEditingController usernameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  Widget LoginPage() {
    return Header(child: loginLoading ? const Center(child: Text("Loading...")) : Column(mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text("Let's Get you ${isLogin ? "Logged-In" : "Registered"}!",
              style: TextStyle(fontSize: 20)),
          const SizedBox(height: 30,),
           Row(mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(Icons.person), SizedBox(width: 15,),

              SizedBox(width: 250,
                child: TextField(controller: usernameController,
                  decoration: InputDecoration(hintText: "Username"),),)
            ],),
           Row(mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(Icons.key),
              SizedBox(width: 15,),
              SizedBox(width: 250,
                child: TextField(controller:passwordController,obscureText: true,
                  decoration: InputDecoration(hintText: "Password"),),)
            ],),
          const SizedBox(height: 20,),
          NeonButton(height: 40,
              width: 200,
              onPressed: () async{
                if(usernameController.text.length < 3){
                  Dialogs.showAlertDialog(context, "Invalid Input", "Username must be longer than 3 characters");
                  return;
                }
                if(passwordController.text.length < 3){
                  Dialogs.showAlertDialog(context, "Invalid Input", "Password must be longer than 3 characters");
                  return;
                }
                if(passwordController.text.contains(" ") || usernameController.text.contains(" ")){
                  Dialogs.showAlertDialog(context, "Invalid Input", "Neither the username nor password can contain spaces");
                  return;
                }
                setState(() {
                  loginLoading = true;
                });
                if(isLogin){

                  int loginResult = await LoginManager.Login(usernameController.text, passwordController.text);

                  if(loginResult == 0){
                    loadHome();
                  }else if(loginResult == 5){
                    Dialogs.showAlertDialog(context, "Login Failed", "Incorrect username or password");
                  }else{
                    Dialogs.showAlertDialog(context, "Login Failed", "Error code : $loginResult");
                  }
                }else{
                  int regResult = await LoginManager.Register(usernameController.text, passwordController.text);

                  if(regResult == 0){
                    loadHome();
                  }else if(regResult == 5){
                    Dialogs.showAlertDialog(context, "Register Failed", "Username Already exists, Please try again with a different username");
                  }else{
                    Dialogs.showAlertDialog(context, "Register Failed", "Error code : $regResult");
                  }
                }
                setState(() {
                  loginLoading = false;
                });
              },
              text: isLogin ? "Login" : "Register"),
          const SizedBox(height: 10,),
          InkWell(
            child: Text(isLogin
                ? "Don't have an account? Register here"
                : "Already have an Account? Login here",
                style: TextStyle(color: Colors.blue)), onTap: () {
            setState(() {
              isLogin = !isLogin;
            });
          },),
          const Padding(
            padding: EdgeInsets.all(25.0),
            child: Center(child: Text("OR")),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center, children: [
            NeonButton(onPressed: () {
              // Dialogs.showAlertDialog(context, "Test", "This is a test message");
              SignWithGoogle();
            },
                text: "Sign with Google",
                colors: [Colors.green, Colors.teal],
                fontSize: 18,
                height: 45,
                heading: Icon(Icons.g_mobiledata, size: 40,))
          ],)

        ]));
  }

  Widget Header({required Widget child, MainAxisAlignment alignment = MainAxisAlignment.start}) {
    return Column(
      mainAxisSize: MainAxisSize.max,
      mainAxisAlignment: alignment,
      children: [
        const SizedBox(height: 50,),
        AnimatedSize(
          duration: const Duration(seconds: 1),
          curve: Curves.fastLinearToSlowEaseIn,
          child: SizedBox(
            height: (counter == 1) ? 180 : 250,
            child: Center(
              child: Image.asset(
                'images/fhub_logo.png',
                filterQuality: FilterQuality.medium,
              ),
            ),
          ),
        ),
        Expanded(child: child)
      ],
    );
  }

  Future<void> SignWithGoogle() async {
    setState(() {
      loginLoading = true;
    });
    GoogleSignIn _googleSignIn = GoogleSignIn(
      scopes: [
        'email',
        'https://www.googleapis.com/auth/contacts.readonly',
      ],
    );

    try {
      GoogleSignInAccount? account = await _googleSignIn.signIn();

      String email = account!.email;
      Debug.LogResponse(email);
      int registerResult = await LoginManager.GoogleLogin(email);

      if(registerResult == 0){
        loadHome();
      }else if(registerResult == 1){
        Dialogs.showAlertDialog(context, "Failed", "Servers are unreachable. Please check internet connection and try again.");
      }else if(registerResult == 5){
        Dialogs.showAlertDialog(context, "Failed", "Couldn't Login with this google account");
      }


    } catch (error) {
      print(error);
      print("google sign in failed");
    }
    setState(() {
      loginLoading = false;
    });
  }
}