package org.apache.fineract.ui.online.groups.grouptasks

import android.app.Dialog
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import butterknife.ButterKnife
import butterknife.OnClick
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.android.synthetic.main.fragment_group_tasks_bottom_sheet.view.*
import org.apache.fineract.R
import org.apache.fineract.data.Status
import org.apache.fineract.data.models.Group
import org.apache.fineract.data.models.customer.Command
import org.apache.fineract.ui.base.FineractBaseActivity
import org.apache.fineract.ui.base.FineractBaseBottomSheetDialogFragment
import org.apache.fineract.ui.base.Toaster
import org.apache.fineract.ui.online.groups.grouplist.GroupViewModel
import org.apache.fineract.ui.online.groups.grouplist.GroupViewModelFactory
import javax.inject.Inject

/**
 * Created by Ahmad Jawid Muhammadi on 04/April/2020
 */
class GroupTasksBottomSheetFragment(val group: Group) : FineractBaseBottomSheetDialogFragment() {

    lateinit var rootView: View
    private var command = Command()
    lateinit var behavior: BottomSheetBehavior<*>
    private lateinit var viewModel: GroupViewModel

    @Inject
    lateinit var viewModelFactory: GroupViewModelFactory

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
        rootView = View.inflate(context, R.layout.fragment_group_tasks_bottom_sheet, null)
        dialog.setContentView(rootView)
        behavior = BottomSheetBehavior.from(rootView.parent as View)
        (activity as FineractBaseActivity).activityComponent.inject(this)
        ButterKnife.bind(this, rootView)
        viewModel = ViewModelProviders.of(this, viewModelFactory).get(GroupViewModel::class.java)
        setDataOnViews()

        subscribeUI()
        return dialog
    }

    private fun subscribeUI() {
        viewModel.status.observe(this, Observer { status ->
            when (status) {
                Status.LOADING -> {
                    showMifosProgressDialog(getString(R.string.please_wait_updating_group_status))
                }
                Status.ERROR -> {
                    hideMifosProgressDialog()
                    Toaster.show(rootView, R.string.error_while_updating_group_status, Toast.LENGTH_SHORT)
                }
                Status.DONE -> {
                    Toaster.show(rootView, getString(R.string.group_identifier_updated_successfully, group.identifier), Toast.LENGTH_SHORT)
                    hideMifosProgressDialog()
                    dismiss()
                }
            }
        })
    }

    private fun setDataOnViews() {
        when (group.status) {
            Group.Status.ACTIVE -> {
                rootView.iv_task.setImageDrawable(
                        ContextCompat.getDrawable(activity!!, R.drawable.ic_close_black_24dp))
                rootView.iv_task.setColorFilter(ContextCompat.getColor(activity!!, R.color.red_dark))
                rootView.tv_task.text = getString(R.string.close)
            }
            Group.Status.PENDING -> {
                rootView.iv_task.setImageDrawable(ContextCompat.getDrawable(activity!!,
                        R.drawable.ic_check_circle_black_24dp))
                rootView.iv_task.setColorFilter(ContextCompat.getColor(activity!!, R.color.status))
                rootView.tv_task.text = getString(R.string.activate)
            }
            Group.Status.CLOSED -> {
                rootView.iv_task.setImageDrawable(ContextCompat.getDrawable(activity!!,
                        R.drawable.ic_check_circle_black_24dp))
                rootView.iv_task.setColorFilter(ContextCompat.getColor(activity!!, R.color.status))
                rootView.tv_task.text = getString(R.string.reopen)
            }
        }
    }

    @OnClick(R.id.iv_task)
    fun onTaskImageViewClicked() {
        when (group.status) {
            Group.Status.ACTIVE -> {
                command.action = Command.Action.CLOSE
                rootView.tv_header.text = getString(R.string.close)
                rootView.tv_sub_header.text = getString(R.string.please_verify_following_group_task, getString(R.string.lock))
                rootView.btn_submit_task.text = getString(R.string.close)
            }
            Group.Status.PENDING -> {
                command.action = Command.Action.ACTIVATE
                rootView.tv_header.text = getString(R.string.activate)
                rootView.tv_sub_header.text = getString(R.string.please_verify_following_group_task, getString(R.string.activate))
                rootView.btn_submit_task.text = getString(R.string.activate)
            }
            Group.Status.CLOSED -> {
                command.action = Command.Action.REOPEN
                rootView.tv_header.text = getString(R.string.reopen)
                rootView.tv_sub_header.text = getString(R.string.please_verify_following_group_task, getString(R.string.reopen))
                rootView.btn_submit_task.text = getString(R.string.reopen)
            }
        }
        rootView.ll_task_list.visibility = View.GONE
        rootView.ll_task_form.visibility = View.VISIBLE
    }

    @OnClick(R.id.btn_submit_task)
    fun submitTask() {
        command.comment = rootView.et_comment.text.toString().trim { it <= ' ' }
        rootView.et_comment.isEnabled = false
        group.identifier?.let {
            viewModel.changeGroupStatus(it, command)
        }
    }

    @OnClick(R.id.btn_cancel)
    fun onCancel() {
        dismiss()
    }

    override fun onStart() {
        super.onStart()
        behavior?.state = BottomSheetBehavior.STATE_EXPANDED
    }

    override fun onDestroy() {
        super.onDestroy()
        hideMifosProgressBar()
    }
}
