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 onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
    }

    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)
        viewModel.getGroups().observe(this,

                Observer {
                    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)
    }

}