package com.aiosman.riderpro.ui.login

import android.util.Log
import android.widget.Toast
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
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.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
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.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.aiosman.riderpro.AppState
import com.aiosman.riderpro.AppStore
import com.aiosman.riderpro.ErrorCode
import com.aiosman.riderpro.LocalNavController
import com.aiosman.riderpro.R
import com.aiosman.riderpro.data.AccountService
import com.aiosman.riderpro.data.AccountServiceImpl
import com.aiosman.riderpro.data.CaptchaService
import com.aiosman.riderpro.data.CaptchaServiceImpl
import com.aiosman.riderpro.data.ServiceException
import com.aiosman.riderpro.data.api.CaptchaInfo
import com.aiosman.riderpro.data.api.CaptchaResponseBody
import com.aiosman.riderpro.data.api.DotPosition
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.ClickCaptchaDialog
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


@Composable
fun UserAuthScreen() {
    var email by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    var rememberMe by remember { mutableStateOf(false) }
    val accountService: AccountService = AccountServiceImpl()
    val captchaService: CaptchaService = CaptchaServiceImpl()
    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) }
    var captchaInfo by remember { mutableStateOf<CaptchaInfo?>(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
    }

    var captchaData by remember { mutableStateOf<CaptchaResponseBody?>(null) }
    fun loadLoginCaptcha() {
        scope.launch {
            try {
                captchaData = captchaService.generateLoginCaptcha(email)
                captchaData?.let {
                    captchaInfo = CaptchaInfo(
                        id = it.id,
                        dot = emptyList()
                    )
                }

            } catch (e: ServiceException) {
                Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
            }
        }
    }

    fun onLogin(captchaInfo: CaptchaInfo? = null) {
        if (!validateForm()) {
            return
        }
        Log.d("UserAuthScreen", "onLogin: $captchaInfo")
        scope.launch {
            try {
                // 检查是否需要验证码
                if (captchaInfo == null && captchaService.checkLoginCaptcha(email)) {
                    loadLoginCaptcha()
                    return@launch
                }
                // 获取用户凭证
                Log.d("UserAuthScreen", "loginUserWithPassword")
                Log.d("UserAuthScreen", "email: $email")
                Log.d("UserAuthScreen", "password: $password")
                val authResp = accountService.loginUserWithPassword(email, password, captchaInfo)
                if (authResp.token != null) {
                    Log.d("UserAuthScreen", "authResp.token: ${authResp.token}")
                    AppStore.updateLoginState(true)
                    AppStore.apply {
                        token = authResp.token
                        this.rememberMe = rememberMe
                        saveData()
                    }
                    AppState.initWithAccount(scope, context)
                    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 if (e.code == ErrorCode.InvalidateCaptcha.code) {
                    loadLoginCaptcha()
                    Toast.makeText(
                        context,
                        context.getString(R.string.incorrect_captcha_please_try_again),
                        Toast.LENGTH_SHORT
                    ).show()
                } else {

                    Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
                }
            } catch (e: Exception) {

                Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
            } finally {
                captchaData = null
            }
        }

    }


    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()
            }
        }

    }
    captchaData?.let {
        ClickCaptchaDialog(
            onDismissRequest = {
                captchaData = null
            },
            captchaData = it,
            onLoadCaptcha = {
                loadLoginCaptcha()
            },
            onPositionClicked = { offset ->
                captchaInfo?.let { info ->
                    val dots = info.dot.toMutableList()
                    val lastDotIndex = dots.size - 1
                    dots += DotPosition(
                        index = lastDotIndex + 1,
                        x = offset.x.toInt(),
                        y = offset.y.toInt()
                    )
                    captchaInfo = info.copy(dot = dots)
                    // 检查是否完成
                    if (dots.size == it.count) {
                        onLogin(captchaInfo)
                    }
                }
            },
        )
    }
    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
                },
                hint = stringResource(R.string.text_hint_email),
                error = emailError
            )
            Spacer(modifier = Modifier.padding(4.dp))
            TextInputField(
                modifier = Modifier
                    .fillMaxWidth(),
                text = password,
                onValueChange = {
                    password = it
                },
                password = true,
                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,
                    style = TextStyle(
                        fontWeight = FontWeight.W500
                    )
                )
                Spacer(modifier = Modifier.weight(1f))
                Text(
                    stringResource(R.string.forgot_password),
                    fontSize = 12.sp,
                    modifier = Modifier.noRippleClickable {
                        navController.navigate(NavigationRoute.ResetPassword.route)
                    },
                    style = TextStyle(
                        fontWeight = FontWeight.W500
                    )
                )

            }
            Spacer(modifier = Modifier.height(46.dp))
            ActionButton(
                modifier = Modifier.fillMaxWidth(),
                text = stringResource(R.string.lets_ride_upper),
                backgroundColor = Color(0xffda3832),
                color = Color.White
            ) {
                onLogin()
            }
            Spacer(modifier = Modifier.height(16.dp))
            Text(stringResource(R.string.or_login_with), color = Color(0xFF999999))
            Spacer(modifier = Modifier.height(16.dp))
            ActionButton(
                modifier = Modifier.fillMaxWidth(),
                text = stringResource(R.string.sign_in_with_google),
                color = Color.Black,
                leading = {
                    Image(
                        painter = painterResource(id = R.drawable.rider_pro_google),
                        contentDescription = "Google",
                        modifier = Modifier.size(36.dp)
                    )
                },
                expandText = true,
                contentPadding = PaddingValues(vertical = 8.dp, horizontal = 8.dp)
            ) {
                googleLogin()
            }
        }

    }


}

