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

import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.*
import androidx.appcompat.widget.SearchView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import butterknife.ButterKnife
import butterknife.OnClick
import kotlinx.android.synthetic.main.fragment_group_list.*
import org.apache.fineract.R
import org.apache.fineract.data.models.Group
import org.apache.fineract.ui.adapters.GroupsAdapter
import org.apache.fineract.ui.base.FineractBaseActivity
import org.apache.fineract.ui.base.FineractBaseFragment
import org.apache.fineract.ui.base.OnItemClickListener
import org.apache.fineract.ui.online.groups.GroupAction
import org.apache.fineract.ui.online.groups.creategroup.CreateGroupActivity
import org.apache.fineract.ui.online.groups.groupdetails.GroupDetailsActivity
import org.apache.fineract.utils.Constants
import javax.inject.Inject


/*
 * Created by saksham on 15/June/2019
*/


class GroupListFragment : FineractBaseFragment(), OnItemClickListener {

    lateinit var rootView: View

    lateinit var viewModel: GroupViewModel

    @Inject
    lateinit var adapter: GroupsAdapter

    @Inject
    lateinit var groupViewModelFactory: GroupViewModelFactory


    lateinit var groupList: ArrayList<Group>

    val searchedGroup: (ArrayList<Group>) -> Unit = { groups ->
        adapter.setGroupList(groups)
    }

    companion object {
        fun newInstance(): GroupListFragment {
            return GroupListFragment()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        rootView = inflater.inflate(R.layout.fragment_group_list, container, false)
        (activity as FineractBaseActivity).activityComponent.inject(this)
        viewModel = ViewModelProviders.of(this, groupViewModelFactory)
                .get(GroupViewModel::class.java)
        return rootView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        ButterKnife.bind(this, rootView)
        adapter.setItemClickListener(this)

        rvGroups.adapter = adapter
        rvGroups.layoutManager = LinearLayoutManager(context)
    }

    override fun onStart() {
        super.onStart()
        viewModel.getGroups()?.observe(this, Observer {
            it?.let {
                groupList = it
                adapter.setGroupList(it)
            }
        })
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater.inflate(R.menu.menu_group_search, menu)

        val searchManager = activity?.getSystemService(Context.SEARCH_SERVICE) as SearchManager
        val searchView = menu.findItem(R.id.group_search).actionView as SearchView

        searchView.setSearchableInfo(searchManager.getSearchableInfo(activity?.componentName))

        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                viewModel.searchGroup(groupList, query, searchedGroup)
                return false
            }

            override fun onQueryTextChange(newText: String): Boolean {
                if (TextUtils.isEmpty(newText)) {
                    adapter.setGroupList(groupList)
                }
                viewModel.searchGroup(groupList, newText, searchedGroup)
                return true
            }
        })
    }

    override fun onItemClick(childView: View?, position: Int) {
        val intent = Intent(context, GroupDetailsActivity::class.java).apply {
            putExtra(Constants.GROUP, groupList[position])
        }
        startActivity(intent)
    }

    override fun onItemLongPress(childView: View?, position: Int) {
    }

    @OnClick(R.id.fabAddGroup)
    fun addGroup() {
        val intent = Intent(activity, CreateGroupActivity::class.java).apply {
            putExtra(Constants.GROUP_ACTION, GroupAction.CREATE)
        }
        startActivity(intent)
    }

}