package com.teambition.talk.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.listener.PauseOnScrollListener;
import com.teambition.talk.BizLogic;
import com.teambition.talk.R;
import com.teambition.talk.adapter.RoomMemberAdapter;
import com.teambition.talk.client.TalkClient;
import com.teambition.talk.entity.Member;
import com.teambition.talk.entity.Room;
import com.teambition.talk.entity.Story;
import com.teambition.talk.realm.MemberRealm;
import com.teambition.talk.rx.EmptyAction;
import com.umeng.analytics.MobclickAgent;

import org.parceler.Parcels;

import java.util.ArrayList;
import java.util.List;

import butterknife.ButterKnife;
import butterknife.InjectView;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func0;
import rx.functions.Func1;

/**
 * Created by zeatual on 14/12/9.
 */
public class SelectMemberActivity extends BaseActivity {

    @InjectView(R.id.toolbar)
    Toolbar toolbar;
    @InjectView(R.id.listView)
    ListView listView;

    private Room room;
    private Story story;
    private Member member;
    private RoomMemberAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_member);
        ButterKnife.inject(this);

        if (getIntent().hasExtra("room")) {
            room = Parcels.unwrap(getIntent().getExtras().getParcelable("room"));
        } else if (getIntent().hasExtra("story")) {
            story = Parcels.unwrap(getIntent().getExtras().getParcelable("story"));
        } else if (getIntent().hasExtra("member")) {
            member = Parcels.unwrap(getIntent().getExtras().getParcelable("member"));
        }

        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle(R.string.title_choose_member);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        adapter = new RoomMemberAdapter(this);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent();
                intent.putExtra("data", Parcels.wrap(adapter.getItem(position)));
                setResult(RESULT_OK, intent);
                finish();
            }
        });
        listView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, true));

        Observable<List<Member>> memberStream = null;
        if (room != null) {
            memberStream = TalkClient.getInstance().getTalkApi()
                    .readOneRoom(room.get_id())
                    .map(new Func1<Room, List<Member>>() {
                        @Override
                        public List<Member> call(Room room) {
                            return room.getMembers();
                        }
                    });
        } else if (story != null) {
            story = Parcels.unwrap(getIntent().getExtras().getParcelable("story"));
            memberStream = MemberRealm.getInstance().getMembersByIds(story.get_memberIds());
        } else if (member != null) {
            memberStream = Observable.defer(new Func0<Observable<List<Member>>>() {
                @Override
                public Observable<List<Member>> call() {
                    List<Member> members = new ArrayList<>();
                    members.add(member);
                    return Observable.just(members);
                }
            });
        }
        memberStream.observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<Member>>() {
                    @Override
                    public void call(List<Member> members) {
                        int position = -1;
                        for (int i = 0; i < members.size(); i++) {
                            if (BizLogic.isMe(members.get(i).get_id())) {
                                position = i;
                                break;
                            }
                        }
                        if (position != -1) {
                            members.remove(position);
                        }
                        if (member == null) {
                            Member all = new Member();
                            all.set_id("all");
                            all.setAlias(getString(R.string.at_all));
                            members.add(0, all);
                        }
                        adapter.updateData(members);
                    }
                }, new EmptyAction<Throwable>());
    }

    @Override
    public void onResume() {
        super.onResume();
        MobclickAgent.onResume(this);
        MobclickAgent.onPageStart(getClass().getName());
    }

    @Override
    public void onPause() {
        super.onPause();
        MobclickAgent.onPause(this);
        MobclickAgent.onPageEnd(getClass().getName());
    }

    public void onLoadMembersFinish(List<Member> members) {
        int position = -1;
        for (int i = 0; i < members.size(); i++) {
            if (BizLogic.isMe(members.get(i).get_id())) {
                position = i;
                break;
            }
        }
        if (position != -1) {
            members.remove(position);
        }
        adapter.updateData(members);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}