package com.aiosman.riderpro.ui.login

import android.widget.Toast
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.credentials.CredentialManager
import com.aiosman.riderpro.AppStore
import com.aiosman.riderpro.LocalNavController
import com.aiosman.riderpro.Messaging
import com.aiosman.riderpro.R
import com.aiosman.riderpro.data.AccountService
import com.aiosman.riderpro.data.AccountServiceImpl
import com.aiosman.riderpro.data.ServiceException
import com.aiosman.riderpro.ui.NavigationRoute
import com.aiosman.riderpro.ui.comment.NoticeScreenHeader
import com.aiosman.riderpro.ui.composables.ActionButton
import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout
import com.aiosman.riderpro.ui.composables.StatusBarSpacer
import com.aiosman.riderpro.ui.composables.TextInputField
import com.aiosman.riderpro.ui.modifiers.noRippleClickable
import com.aiosman.riderpro.utils.GoogleLogin
import kotlinx.coroutines.launch


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun UserAuthScreen() {
    var email by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    var rememberMe by remember { mutableStateOf(false) }
    var accountService: AccountService = AccountServiceImpl()
    val scope = rememberCoroutineScope()
    val navController = LocalNavController.current
    val context = LocalContext.current
    var emailError by remember { mutableStateOf<String?>(null) }
    var passwordError by remember { mutableStateOf<String?>(null) }
    fun validateForm(): Boolean {
        emailError =
            if (email.isEmpty()) context.getString(R.string.text_error_email_required) else null
        passwordError =
            if (password.isEmpty()) context.getString(R.string.text_error_password_required) else null
        return emailError == null && passwordError == null
    }

    fun onLogin() {
        if (!validateForm()) {
            return
        }
        scope.launch {
            try {
                val authResp = accountService.loginUserWithPassword(email, password)
                if (authResp.token != null) {
                    AppStore.apply {
                        token = authResp.token
                        this.rememberMe = rememberMe
                        saveData()
                    }
                    Messaging.InitFCM(scope)
                    navController.navigate(NavigationRoute.Index.route) {
                        popUpTo(NavigationRoute.Login.route) { inclusive = true }
                    }
                }
            } catch (e: ServiceException) {
                // handle error

                if (e.code == 12005) {
                    emailError = context.getString(R.string.error_invalidate_username_password)
                    passwordError = context.getString(R.string.error_invalidate_username_password)
                } else {
                    Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
                }
            }
        }

    }


    fun googleLogin() {
        scope.launch {
            try {
                GoogleLogin(context) {
                    scope.launch {
                        try {
                            val authResp = accountService.loginUserWithGoogle(it)
                            if (authResp.token != null) {
                                AppStore.apply {
                                    token = authResp.token
                                    this.rememberMe = rememberMe
                                    saveData()
                                }
                                navController.navigate(NavigationRoute.Index.route) {
                                    popUpTo(NavigationRoute.Login.route) { inclusive = true }
                                }
                            }
                        } catch (e: ServiceException) {
                            // handle error
                            e.printStackTrace()
                            Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
                        }
                    }
                }
            } catch (e: Exception) {
                Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
            }

        }

    }
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White)
    ) {
        StatusBarSpacer()
        Box(
            modifier = Modifier
                .fillMaxWidth()
                .padding(top = 16.dp, start = 16.dp, end = 16.dp)
        ) {
            NoticeScreenHeader(stringResource(R.string.login_upper), moreIcon = false)
        }
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .weight(1f)
                .padding(horizontal = 24.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            Spacer(modifier = Modifier.padding(48.dp))
            TextInputField(
                modifier = Modifier
                    .fillMaxWidth(),
                text = email,
                onValueChange = {
                    email = it
                },
                label = stringResource(R.string.login_email_label),
                hint = stringResource(R.string.text_hint_email),
                error = emailError
            )
            Spacer(modifier = Modifier.padding(16.dp))
            TextInputField(
                modifier = Modifier
                    .fillMaxWidth(),
                text = password,
                onValueChange = {
                    password = it
                },
                password = true,
                label = stringResource(R.string.login_password_label),
                hint = stringResource(R.string.text_hint_password),
                error = passwordError
            )
            Spacer(modifier = Modifier.height(32.dp))
            Row(
                verticalAlignment = Alignment.CenterVertically
            ) {
                com.aiosman.riderpro.ui.composables.Checkbox(
                    checked = rememberMe,
                    onCheckedChange = {
                        rememberMe = it
                    },
                    size = 18
                )
                Text(
                    stringResource(R.string.remember_me),
                    modifier = Modifier.padding(start = 8.dp),
                    fontSize = 12.sp
                )
                Spacer(modifier = Modifier.weight(1f))
                Text(
                    stringResource(R.string.forgot_password),
                    fontSize = 12.sp,
                    modifier = Modifier.noRippleClickable {
                        navController.navigate(NavigationRoute.ResetPassword.route)
                    }
                )
//                CompositionLocalProvider(LocalMinimumInteractiveComponentEnforcement provides false) {
//                    Checkbox(
//                        checked = rememberMe,
//                        onCheckedChange = {
//                            rememberMe = it
//                        },
//                        colors = CheckboxDefaults.colors(
//                            checkedColor = Color.Black
//                        ),
//                    )
//                    Text(
//                        stringResource(R.string.remember_me),
//                        modifier = Modifier.padding(start = 8.dp),
//                        fontSize = 12.sp
//                    )
//                    Spacer(modifier = Modifier.weight(1f))
//                    Text(stringResource(R.string.forgot_password), fontSize = 12.sp, modifier = Modifier.noRippleClickable {
//                        navController.navigate(NavigationRoute.ResetPassword.route)
//                    })
//                }

            }
            Spacer(modifier = Modifier.height(64.dp))
            ActionButton(
                modifier = Modifier
                    .width(345.dp)
                    .height(48.dp),
                text = stringResource(R.string.lets_ride_upper),
                backgroundImage = R.mipmap.rider_pro_signup_red_bg
            ) {
                onLogin()
            }
            Spacer(modifier = Modifier.height(48.dp))
            Text(stringResource(R.string.or_login_with), color = Color(0xFF999999))
            Spacer(modifier = Modifier.height(16.dp))
            Row {
                Box(
                    modifier = Modifier
                        .size(96.dp)
                        .padding(16.dp)
                        .border(2.dp, Color(0xFFEBEBEB))
                        .noRippleClickable {
                            // login with facebook
                            googleLogin()
                        }
                ) {
                    Image(
                        painter = painterResource(id = R.drawable.rider_pro_google),
                        contentDescription = "Google",
                        modifier = Modifier.fillMaxSize()
                    )
                }
            }
        }

    }


}

