package com.lockit.apps;

import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.lockit.Application;
import com.lockit.BaseFragment;
import com.lockit.CustomRecyclerAdapter;
import com.lockit.R;
import com.squareup.otto.Subscribe;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.IgnoredWhenDetached;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;

import java.util.List;

import rx.Observable;
import rx.subjects.PublishSubject;

import static com.lockit.BusProvider.bus;

@EFragment(R.layout.apps_fragment)
public class AppsFragment extends BaseFragment implements ApplicationView {
    private PublishSubject<Void> initialization = PublishSubject.create();
    private PublishSubject<String> appLock = PublishSubject.create();
    private PublishSubject<String> appUnlock = PublishSubject.create();

    @ViewById
    RecyclerView apps;

    private CustomRecyclerAdapter<Application, AppItemView> appsAdapter;

    @AfterViews
    void init() {
        bus().register(this);
        initialization.onNext(null);
    }

    @Override
    public Observable<Void> initialized() {
        return bindObservable(initialization.asObservable());
    }

    @Override
    @UiThread
    @IgnoredWhenDetached
    public void showAllApps(List<Application> allApps) {
        apps.setAdapter(appsAdapter(allApps));
        apps.setLayoutManager(new LinearLayoutManager(getActivity()));
//        ItemClickSupport.addTo(apps)
//                .setOnItemClickListener(
//                        (view, position, id) -> appSelected(appsAdapter.getItem(position)));
    }

    @NonNull
    private CustomRecyclerAdapter<Application, AppItemView> appsAdapter(List<Application> allApps) {
        if (appsAdapter == null)
            appsAdapter = new CustomRecyclerAdapter<>(allApps, this::appItemView);
        return appsAdapter;
    }

    private AppItemView appItemView() {
        return AppItemView_.build(getActivity());
    }

    @Override
    public Observable<String> appLocked() {
        return bindObservable(appLock.asObservable());
    }

    @Override
    @UiThread
    @IgnoredWhenDetached
    public void showAppLocked() {
        appsAdapter.notifyDataSetChanged();
    }

    @Override
    public Observable<String> appUnlocked() {
        return bindObservable(appUnlock.asObservable());
    }

    @Override
    @UiThread
    @IgnoredWhenDetached
    public void showAppUnlocked() {
        appsAdapter.notifyDataSetChanged();
    }

    @Subscribe
    public void appSelected(Application application) {
        if (application.isLocked())
            appUnlock.onNext(application.getPackageName());
        else
            appLock.onNext(application.getPackageName());
        application.toggleLockState();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        bus().unregister(this);
    }
}