package com.example.taskmanagement.task

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.AutoCompleteTextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.taskmanagement.R
import com.example.taskmanagement.databinding.FragmentModifySubTaskBinding
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FirebaseFirestore

class ModifySubTaskFragment : Fragment() {

    private lateinit var binding: FragmentModifySubTaskBinding
    private lateinit var mAuth: FirebaseAuth
    private val db = FirebaseFirestore.getInstance()
    private var subtaskId: String? = null
    private var taskId: String? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentModifySubTaskBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        mAuth = FirebaseAuth.getInstance()
        val currentUser = mAuth.currentUser

        if (currentUser == null) {
            Toast.makeText(
                requireContext(),
                getString(R.string.error_loading_users),
                Toast.LENGTH_SHORT
            ).show()
            findNavController().navigate(R.id.profileFragment)
            return
        }

        taskId = arguments?.getString("taskID")
        subtaskId = arguments?.getString("subtaskId")

        if (subtaskId == null) {
            Toast.makeText(
                requireContext(),
                getString(R.string.error_subtask_not_found),
                Toast.LENGTH_SHORT
            ).show()
            findNavController().popBackStack()
            return
        }
        binding.buttonBack.setOnClickListener {
            findNavController().popBackStack()
        }

        loadSubtaskData()
    }

    private fun loadSubtaskData() {
        db.collection("tasks")
            .document(taskId ?: "")
            .collection("subTasks")
            .document(subtaskId!!)
            .get()
            .addOnSuccessListener { document ->
                if (document.exists()) {
                    val subtask = document.toObject(SubTask::class.java)
                    subtask?.let { populateFields(it) }
                } else {
                    showErrorToast(R.string.error_subtask_not_found)
                    findNavController().popBackStack()
                }
            }
            .addOnFailureListener { exception ->
                Log.e("ModifySubTaskFragment", "Error loading document", exception)
                showErrorToast(R.string.error_task_not_modify, exception.message)
            }

    }


    private fun showErrorToast(messageResId: Int, additionalMessage: String? = null) {
        val message =
            additionalMessage?.let { getString(messageResId, it) } ?: getString(messageResId)
        Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
    }


    private fun populateFields(subtask: SubTask) {
        binding.subtaskName.setText(subtask.name)
        binding.subtaskDescription.setText(subtask.description)
        binding.subtaskDeadline.setText(subtask.deadline)
        binding.progressSlider.value = subtask.progress.toFloat()
        binding.assignedDropdown.setText(subtask.assignedTo, false)

        setPriorityDropdown(subtask.priority)
        setStatusDropdown(subtask.status)

        loadUsers(binding.assignedDropdown)

        val datePicker = MaterialDatePicker.Builder.datePicker()
            .setTitleText(getString(R.string.select_date))
            .build()

        binding.subtaskDeadline.setOnClickListener {
            datePicker.show(childFragmentManager, "DATE_PICKER")
        }

        datePicker.addOnPositiveButtonClickListener {
            binding.subtaskDeadline.setText(datePicker.headerText)
        }

        binding.saveSubtaskButton.setOnClickListener {
            val subtaskName = binding.subtaskName.text.toString()
            val subtaskDescription = binding.subtaskDescription.text.toString()
            val deadline = binding.subtaskDeadline.text.toString()
            val progress = binding.progressSlider.value.toInt()
            val assignedTo = binding.assignedDropdown.text.toString()
            val priority = getSelectedPriority()
            val status = getSelectedStatus()

            if (subtaskName.isNotEmpty() && subtaskDescription.isNotEmpty() && deadline.isNotEmpty() && assignedTo.isNotEmpty()) {
                val updatedSubtask = SubTask(
                    name = subtaskName,
                    description = subtaskDescription,
                    deadline = deadline,
                    progress = progress,
                    status = status,
                    assignedTo = assignedTo,
                    priority = priority,
                    createdBy = mAuth.currentUser?.email
                )

                db.collection("tasks")
                    .document(taskId ?: "")
                    .collection("subTasks")
                    .document(subtaskId!!)
                    .set(updatedSubtask)
                    .addOnSuccessListener {
                        Toast.makeText(
                            requireContext(),
                            getString(R.string.subtask_updated_successfully),
                            Toast.LENGTH_SHORT
                        ).show()

                        findNavController().popBackStack()
                    }
                    .addOnFailureListener { exception ->
                        Toast.makeText(
                            requireContext(),
                            getString(R.string.error_updating_task, exception.message),
                            Toast.LENGTH_SHORT
                        ).show()
                    }
            } else {
                Toast.makeText(
                    requireContext(),
                    getString(R.string.all_fields_required),
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
    }

    private fun setPriorityDropdown(priority: Int) {
        val priorityOptions = resources.getStringArray(R.array.priority_filters).toList()
        val adapter = ArrayAdapter(
            requireContext(),
            R.layout.dropdown_item,
            priorityOptions
        )
        binding.priorityDropdown.setAdapter(adapter)

        if (priority in priorityOptions.indices) {
            binding.priorityDropdown.setText(priorityOptions[priority], false)
        }
    }


    private fun getSelectedPriority(): Int {
        val priorities = resources.getStringArray(R.array.priority_filters)
        return priorities.indexOf(binding.priorityDropdown.text.toString()).takeIf { it >= 0 } ?: 0
    }

    private fun setStatusDropdown(status: Int) {
        val statusOptions = resources.getStringArray(R.array.status_filters).toList()
        val adapter = ArrayAdapter(
            requireContext(),
            R.layout.dropdown_item,
            statusOptions
        )
        binding.statusDropdown.setAdapter(adapter)
        if (status in statusOptions.indices) {
            binding.priorityDropdown.setText(statusOptions[status], false)
        }
    }

    private fun getSelectedStatus(): Int {
        val priorities = resources.getStringArray(R.array.status_filters)
        return priorities.indexOf(binding.statusDropdown.text.toString()).takeIf { it >= 0 } ?: 0
    }

    private fun loadUsers(assignedToDropdown: AutoCompleteTextView) {
        val currentUser = mAuth.currentUser ?: return
        val userRoleRef = db.collection("users").document(currentUser.uid)

        userRoleRef.get().addOnSuccessListener { document ->
            val userRole = document.getString("role")

            if (userRole != null) {
                val query = when (userRole) {
                    "PM" -> db.collection("users").whereEqualTo("role", "PL")
                    "PL" -> db.collection("users").whereEqualTo("role", "Dev")
                    else -> db.collection("users").whereEqualTo("role", "Dev")
                }

                query.get()
                    .addOnSuccessListener { result ->
                        val userList = mutableListOf<String>()

                        for (doc in result) {
                            val userEmail = doc.getString("email")
                            userEmail?.let { userList.add(it) }
                        }

                        val adapter = ArrayAdapter(
                            requireContext(),
                            R.layout.dropdown_item,
                            userList
                        )
                        assignedToDropdown.setAdapter(adapter)
                    }
                    .addOnFailureListener { exception ->
                        Toast.makeText(
                            requireContext(),
                            getString(R.string.failed_to_load_users, exception.message),
                            Toast.LENGTH_SHORT
                        ).show()

                    }
            } else {
                Toast.makeText(
                    requireContext(),
                    getString(R.string.user_role_not_found),
                    Toast.LENGTH_SHORT
                ).show()

            }
        }.addOnFailureListener { exception ->
            Toast.makeText(
                requireContext(),
                getString(R.string.failed_to_retrieve_user_role, exception.message),
                Toast.LENGTH_SHORT
            ).show()

        }
    }
}