package com.fastest.pass.home.presentation.ui.components

import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DatePicker
import androidx.compose.material3.DatePickerDefaults
import androidx.compose.material3.DatePickerDialog
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.material3.rememberDatePickerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.SoftwareKeyboardController
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.fastest.pass.R
import com.fastest.pass.home.domain.model.CountryInfo

@Composable
fun AddDriverLicenseFormScreen(
    onCountryList: (List<CountryInfo>, String) -> Unit,
    countryListDisplayed: List<CountryInfo>
) {
    val keyboardController = LocalSoftwareKeyboardController.current
    val focusManager = LocalFocusManager.current
    val gender = listOf("Please Select", "Male", "Female", "Other")

    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(horizontal = 30.dp)
            .padding(bottom = 20.dp)
            .background(Color.Transparent)
            .imePadding()
    ) {
        SaveButtonADLFS(buttonText = R.string.save)

        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(horizontal = 0.dp)
                .padding(bottom = 80.dp)
                .background(Color.Transparent)
                .verticalScroll(rememberScrollState())
        ) {
            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.title)
            Spacer(modifier = Modifier.height(20.dp))
            TextNumberTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.number, "L123456789")

            Spacer(modifier = Modifier.height(20.dp))
            DatePickerADLFS(labelText = R.string.expiration_date) {}

            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.license_class)
            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.name)
            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.address)
            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.city_town)
            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.state)
            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.zip_postal_code)
            Spacer(modifier = Modifier.height(20.dp))
            SelectCountryInfoDS(
                labelText = R.string.country,
                keyboardController = keyboardController,
                focusManager = focusManager,
                onCountryList = { list, text ->
                    onCountryList.invoke(list, text)
                },
                countryListDisplayed = countryListDisplayed
            )
//            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.country)

            Spacer(modifier = Modifier.height(20.dp))
            DatePickerADLFS(labelText = R.string.date_of_birth) {}

            Spacer(modifier = Modifier.height(20.dp))
            DropDownFieldADLFS(keyboardController = keyboardController, focusManager = focusManager,
                labelText = R.string.gender, titles = gender)
//            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.sex)


            Spacer(modifier = Modifier.height(20.dp))
            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.height)

            Spacer(modifier = Modifier.height(20.dp))
            NotesTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager)
        }
    }
}

@Composable
fun BoxScope.SaveButtonADLFS(buttonText: Int) {
    Button(
        modifier = Modifier
            .background(colorResource(id = R.color.transparent))
            .fillMaxWidth()
            .height(60.dp)
            .align(Alignment.BottomCenter)
            .clickable() { },
        onClick = {},
        shape = RoundedCornerShape(15.dp),
//            border = BorderStroke(25.dp, colorResource(id = R.color.black)),
        colors = ButtonDefaults.buttonColors(
            contentColor = colorResource(id = R.color.white),
            containerColor = colorResource(id = R.color.red_login_button),
        ),
    )
    {
        Text(
            text = stringResource(id = buttonText),
            style = MaterialTheme.typography.bodyMedium.copy(
                fontSize = 20.sp,
                color = colorResource(id = R.color.white)
            ),
            textAlign = TextAlign.Center
        )
    }
}

@Composable
fun ColumnScope.NameTextFieldADLFS(
    keyboardController: SoftwareKeyboardController?,
    focusManager: FocusManager,
    labelText: Int
) {
    var text by remember { mutableStateOf("") }

    TextField(
        value = text,
        onValueChange = {
            text = it
        },
        textStyle = MaterialTheme.typography.displayMedium,
        modifier = Modifier
            .align(Alignment.Start)
            .fillMaxWidth()
            .defaultMinSize(minHeight = 60.dp)
            .wrapContentHeight()
            .border(
                1.dp,
                color = colorResource(id = R.color.gray_border_textfield),
                shape = RoundedCornerShape(16.dp)
            )
            .background(color = colorResource(id = R.color.transparent)),
        shape = RoundedCornerShape(16.dp),
//        placeholder = {
//            Text(
//                text = stringResource(id = R.string.enter_email_address),
//                color = colorResource(id = R.color.gray_splash),
//                style = MaterialTheme.typography.displayMedium
//            )
//        },
        label = {
            Text(text = stringResource(id = labelText),
                style = MaterialTheme.typography.titleSmall.copy(
                    color = colorResource(id = R.color.gray_text)
                )
            )
        },
//        leadingIcon = {
//            Image(
//                painter = painterResource(id = R.drawable.profile_circle),
//                contentDescription = "Title Logo",
//                modifier = Modifier
//                    .size(24.dp, 24.dp)
//            )
//        },
        colors = TextFieldDefaults.colors(
            focusedLabelColor = colorResource(id = R.color.gray_splash),
            unfocusedContainerColor = colorResource(id = R.color.transparent),
            focusedContainerColor = colorResource(id = R.color.transparent),
            focusedIndicatorColor = colorResource(id = R.color.transparent),
            disabledIndicatorColor = colorResource(id = R.color.transparent),
            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
            cursorColor = colorResource(id = R.color.gray_splash),
        ),
        keyboardOptions = KeyboardOptions(
            keyboardType = KeyboardType.Text,
            imeAction = ImeAction.Next
        ),
        keyboardActions = KeyboardActions(
            onDone = {
                focusManager.clearFocus()
                keyboardController?.hide()
            }
        ),
    )
}

@Composable
fun ColumnScope.TextNumberTextFieldADLFS(
    keyboardController: SoftwareKeyboardController?,
    focusManager: FocusManager,
    labelText: Int,
    placeholder: String
) {
    var text by remember { mutableStateOf("") }

    TextField(
        value = text,
        onValueChange = {
            text = it
        },
        textStyle = MaterialTheme.typography.displayMedium,
        modifier = Modifier
            .align(Alignment.Start)
            .fillMaxWidth()
            .defaultMinSize(minHeight = 60.dp)
            .wrapContentHeight()
            .border(
                1.dp,
                color = colorResource(id = R.color.gray_border_textfield),
                shape = RoundedCornerShape(16.dp)
            )
            .background(color = colorResource(id = R.color.transparent)),
        shape = RoundedCornerShape(16.dp),
//        placeholder = {
//            Text(
//                text = placeholder,
//                style = MaterialTheme.typography.titleSmall.copy(
//                    color = colorResource(id = R.color.gray_text)
//                )
//            )
//        },
        label = {
            Text(text = stringResource(id = labelText),
                style = MaterialTheme.typography.titleSmall.copy(
                    color = colorResource(id = R.color.gray_text)
                )
            )
        },
//        leadingIcon = {
//            Image(
//                painter = painterResource(id = R.drawable.profile_circle),
//                contentDescription = "Title Logo",
//                modifier = Modifier
//                    .size(24.dp, 24.dp)
//            )
//        },
        colors = TextFieldDefaults.colors(
            focusedLabelColor = colorResource(id = R.color.gray_splash),
            unfocusedContainerColor = colorResource(id = R.color.transparent),
            focusedContainerColor = colorResource(id = R.color.transparent),
            focusedIndicatorColor = colorResource(id = R.color.transparent),
            disabledIndicatorColor = colorResource(id = R.color.transparent),
            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
            cursorColor = colorResource(id = R.color.gray_splash),
        ),
        keyboardOptions = KeyboardOptions(
            keyboardType = KeyboardType.Text,
            imeAction = ImeAction.Next
        ),
        keyboardActions = KeyboardActions(
            onDone = {
                focusManager.clearFocus()
                keyboardController?.hide()
            }
        ),
    )
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ColumnScope.DatePickerADLFS(
    labelText: Int,
    onDateSelected: (String) -> Unit
) {
    var selectedDate by remember { mutableStateOf("Select Date") }
    var selectedDateMillis by remember { mutableStateOf<Long?>(null) }
    var showDatePicker by remember { mutableStateOf(false) }

    Column(
        modifier = Modifier
            .fillMaxWidth()
            .background(color = colorResource(id = R.color.white)),
    ) {
        TextField(
            value = selectedDate,
            onValueChange = {},
            textStyle = MaterialTheme.typography.displayMedium.copy(
                color = colorResource(id = R.color.gray_text)
            ),
            readOnly = true,
            label = { Text(
                stringResource(id = labelText),
                style = MaterialTheme.typography.titleSmall.copy(
                    color = colorResource(id = R.color.gray_text)
                )
            ) },
            leadingIcon = {
                Icon(
                    imageVector = Icons.Default.DateRange,
                    contentDescription = "Calendar",
                    tint = colorResource(id = R.color.gray_text)
                )
            },
            modifier = Modifier
                .align(Alignment.Start)
                .fillMaxWidth()
                .defaultMinSize(minHeight = 60.dp)
                .wrapContentHeight()
                .border(
                    1.dp,
                    color = colorResource(id = R.color.gray_border_textfield),
                    shape = RoundedCornerShape(16.dp)
                )
                .background(color = colorResource(id = R.color.transparent))
                .clickable {
                    showDatePicker = true
                },
            shape = RoundedCornerShape(16.dp),
            enabled = false,
            colors = TextFieldDefaults.colors(
                disabledContainerColor = colorResource(id = R.color.transparent),
                focusedLabelColor = colorResource(id = R.color.gray_splash),
                unfocusedContainerColor = colorResource(id = R.color.transparent),
                focusedContainerColor = colorResource(id = R.color.transparent),
                focusedIndicatorColor = colorResource(id = R.color.transparent),
                disabledIndicatorColor = colorResource(id = R.color.transparent),
                unfocusedIndicatorColor = colorResource(id = R.color.transparent),
                cursorColor = colorResource(id = R.color.gray_splash),
            ),
            keyboardOptions = KeyboardOptions(
                keyboardType = KeyboardType.Password
            )
        )

        if (showDatePicker) {
            val datePickerState = rememberDatePickerState(
                initialSelectedDateMillis = selectedDateMillis ?: System.currentTimeMillis()
            )

            DatePickerDialog(
                onDismissRequest = {
                    showDatePicker = false
                },
                confirmButton = {
                    TextButton(onClick = {
                        val selectedMillis = datePickerState.selectedDateMillis
                        if (selectedMillis != null) {
                            val formattedDate = convertMillisToFormattedDate(selectedMillis)
                            selectedDate = formattedDate
                            onDateSelected(selectedDate)
                            selectedDateMillis = selectedMillis
                            showDatePicker = false
                        }

                    }) {
                        Text(text = "OK")
                    }
                },
                dismissButton = {
                    TextButton(onClick = { showDatePicker = false }) {
                        Text(text = "Cancel")
                    }
                },
                colors = DatePickerDefaults.colors(
                    containerColor = colorResource(id = R.color.white)
                )
            ) {
                DatePicker(state = datePickerState)
            }
        }
    }

}

@Composable
fun ColumnScope.NotesTextFieldADLFS(
    keyboardController: SoftwareKeyboardController?,
    focusManager: FocusManager
) {
    var notesText by remember { mutableStateOf("") }

    TextField(
        value = notesText,
        onValueChange = {
            notesText = it
        },
        textStyle = MaterialTheme.typography.displayMedium,
        modifier = Modifier
            .align(Alignment.Start)
            .fillMaxWidth()
            .defaultMinSize(minHeight = 60.dp)
            .wrapContentHeight()
            .border(
                1.dp,
                color = colorResource(id = R.color.gray_border_textfield),
                shape = RoundedCornerShape(16.dp)
            )
            .background(color = colorResource(id = R.color.transparent))
        ,
        shape = RoundedCornerShape(16.dp),
//        placeholder = {
//            Text(
//                text = stringResource(id = R.string.enter_email_address),
//                color = colorResource(id = R.color.gray_splash),
//                style = MaterialTheme.typography.displayMedium
//            )
//        },
        label = {
            Text(text = stringResource(R.string.notes),
                style = MaterialTheme.typography.titleSmall.copy(
                    color = colorResource(id = R.color.gray_text)
                )
            )
        },
//        leadingIcon = {
//            Image(
//                painter = painterResource(id = R.drawable.profile_circle),
//                contentDescription = "Title Logo",
//                modifier = Modifier
//                    .size(24.dp, 24.dp)
//            )
//        },
        colors = TextFieldDefaults.colors(
            focusedLabelColor = colorResource(id = R.color.gray_splash),
            unfocusedContainerColor = colorResource(id = R.color.transparent),
            focusedContainerColor = colorResource(id = R.color.transparent),
            focusedIndicatorColor = colorResource(id = R.color.transparent),
            disabledIndicatorColor = colorResource(id = R.color.transparent),
            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
            cursorColor = colorResource(id = R.color.gray_splash),
        ),
        keyboardOptions = KeyboardOptions(
            keyboardType = KeyboardType.Text,
            imeAction = ImeAction.Default
        ),
        keyboardActions = KeyboardActions(
            onDone = {
                focusManager.clearFocus()
                keyboardController?.hide()
            }
        ),
    )
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ColumnScope.DropDownFieldADLFS(
    keyboardController: SoftwareKeyboardController?,
    focusManager: FocusManager,
    labelText: Int,
    titles: List<String>,
    topPadding: Int = 0
) {
    var isExpanded by remember { mutableStateOf(false) }
    var selectedText by remember { mutableStateOf(titles[0]) }

    Column(
        modifier = Modifier
            .fillMaxWidth()
            .background(color = colorResource(id = R.color.white)),
    ) {
        Box(
            modifier = Modifier
                .fillMaxWidth()
                .background(colorResource(id = R.color.white))
        ) {
            ExposedDropdownMenuBox(
                expanded = isExpanded,
                onExpandedChange = { isExpanded = !isExpanded },
                modifier = Modifier
                    .fillMaxWidth()
                    .defaultMinSize(60.dp)
                    .wrapContentHeight()
                    .border(
                        1.dp,
                        color = colorResource(id = R.color.gray_border_textfield),
                        shape = RoundedCornerShape(16.dp)
                    )
                    .background(color = colorResource(id = R.color.white)),
            ) {
                TextField(
                    value = selectedText,
                    onValueChange = {},
                    textStyle = MaterialTheme.typography.displayMedium.copy(
                        color = if (selectedText == titles[0]) colorResource(id = R.color.gray_border_textfield)
                        else colorResource(id = R.color.gray_splash)
                    ),
                    readOnly = true,
                    label = { Text(
                        stringResource(id = labelText),
                        style = MaterialTheme.typography.titleSmall.copy(
                            color = colorResource(id = R.color.gray_text)
                        )
                    ) },
                    trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(isExpanded) },
                    modifier = Modifier
                        .menuAnchor()
                        .fillMaxWidth()
                        .background(color = colorResource(id = R.color.white)),
                    colors = ExposedDropdownMenuDefaults.textFieldColors(
                        focusedLabelColor = colorResource(id = R.color.gray_splash),
                        unfocusedContainerColor = colorResource(id = R.color.transparent),
                        focusedContainerColor = colorResource(id = R.color.transparent),
                        focusedIndicatorColor = colorResource(id = R.color.transparent),
                        disabledIndicatorColor = colorResource(id = R.color.transparent),
                        unfocusedIndicatorColor = colorResource(id = R.color.transparent),
                        cursorColor = colorResource(id = R.color.gray_splash),
                    ),
                    keyboardOptions = KeyboardOptions(
                        keyboardType = KeyboardType.Password
                    )
                )

                ExposedDropdownMenu(
                    expanded = isExpanded,
                    onDismissRequest = { isExpanded = !isExpanded },
                    modifier = Modifier
                        .background(colorResource(id = R.color.white))
                ) {
                    titles.forEachIndexed { _, s ->
                        DropdownMenuItem(
                            text = {
                                Text(
                                    text = s,
                                    style = MaterialTheme.typography.titleSmall.copy(
                                        color = colorResource(id = R.color.gray_splash)
                                    ),
                                    modifier = Modifier
                                        .padding(top = topPadding.dp)
                                )
                            },
                            onClick = {
                                selectedText = s
                                isExpanded = false
                            },
                            modifier = Modifier
                                .background(colorResource(id = R.color.white))
                                .padding(top = 0.dp)
                        )
                    }
                }
            }
        }
    }
}

@Composable
fun ColumnScope.SelectCountryInfoDS(
    labelText: Int,
    keyboardController: SoftwareKeyboardController?,
    focusManager: FocusManager,
    onCountryList: (List<CountryInfo>, String) -> Unit,
    countryListDisplayed: List<CountryInfo>
) {
    var selectedCountry by remember { mutableStateOf("Please Select") }
    var isSheetOpened by remember { mutableStateOf(false) }

    TextField(
        value = selectedCountry,
        onValueChange = {},
        textStyle = MaterialTheme.typography.displayMedium.copy(
            color = if (selectedCountry == "Please Select") colorResource(id = R.color.gray_border_textfield)
            else colorResource(id = R.color.gray_splash)
        ),
        readOnly = true,
        label = {
            Text(
                stringResource(id = labelText),
                style = MaterialTheme.typography.titleSmall.copy(
                    color = colorResource(id = R.color.gray_text)
                )
            ) },
        modifier = Modifier
            .align(Alignment.Start)
            .fillMaxWidth()
            .defaultMinSize(minHeight = 60.dp)
            .wrapContentHeight()
            .border(
                1.dp,
                color = colorResource(id = R.color.gray_border_textfield),
                shape = RoundedCornerShape(16.dp)
            )
            .background(color = colorResource(id = R.color.transparent))
            .clickable {
                isSheetOpened = true
            },
        shape = RoundedCornerShape(16.dp),
        enabled = false,
        colors = TextFieldDefaults.colors(
            disabledContainerColor = colorResource(id = R.color.transparent),
            focusedLabelColor = colorResource(id = R.color.gray_splash),
            unfocusedContainerColor = colorResource(id = R.color.transparent),
            focusedContainerColor = colorResource(id = R.color.transparent),
            focusedIndicatorColor = colorResource(id = R.color.transparent),
            disabledIndicatorColor = colorResource(id = R.color.transparent),
            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
            cursorColor = colorResource(id = R.color.gray_splash),
        ),
        keyboardOptions = KeyboardOptions(
            keyboardType = KeyboardType.Password
        )
    )

    if (isSheetOpened) {
        OpenModalBottomSheet(
            keyboardController,
            focusManager,
            isSheetOpened = {isSheetOpened = false},
            onSelectedCountry = { countryName ->
                selectedCountry = countryName
            },
            onSearchTextChanged = {},
            onCountryList = { list , text ->
                onCountryList.invoke(list, text)
            },
            countryListDisplayed = countryListDisplayed
        )
    }
}