/*
 * Copyright © Yan Zhenjie. All Rights Reserved
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.yanzhenjie.addresscheck.address;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import com.yanzhenjie.addresscheck.R;

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

/**
 * <p>选择地址的页面。</p>
 * Created by YanZhenjie on 2017/6/1.
 */
public class AddressCheckActivity extends AppCompatActivity {

    private static final String KEY_OUTPUT_PROVINCE_CITY_DISTRICT = "KEY_OUTPUT_PROVINCE_CITY_DISTRICT";

    public static ArrayList<City> parse(Intent data) {
        return data.getParcelableArrayListExtra(KEY_OUTPUT_PROVINCE_CITY_DISTRICT);
    }

    TabLayout mTabLayout;
    ViewPager mViewPager;

    AddressListAdapter mOneListAdapter;
    List<City> mOneList;
    int mCurrentOneSelect = -1;

    AddressListAdapter mTwoListAdapter;
    List<City> mTwoList;
    int mCurrentTwoSelect = -1;

    AddressListAdapter mThreeListAdapter;
    List<City> mThreeList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address_select);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        ActionBar actionBar = getSupportActionBar();
        assert actionBar != null;
        actionBar.setDisplayHomeAsUpEnabled(true);

        mTabLayout = (TabLayout) findViewById(R.id.tab);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);
        mTabLayout.addOnTabSelectedListener(tabSelectedListener);

        RecyclerView oneView = new RecyclerView(this);
        RecyclerView twoView = new RecyclerView(this);
        RecyclerView threeView = new RecyclerView(this);
        List<RecyclerView> recyclerViewList = new ArrayList<>();
        recyclerViewList.add(oneView);
        recyclerViewList.add(twoView);
        recyclerViewList.add(threeView);
        PagerViewAdapter<RecyclerView> pagerViewAdapter = new PagerViewAdapter<>(recyclerViewList);
        mViewPager.setAdapter(pagerViewAdapter);
        mTabLayout.setupWithViewPager(mViewPager);
        mTabLayout.getTabAt(0).setText(R.string.select_please);

        oneView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
        oneView.setLayoutManager(new LinearLayoutManager(this));
        mOneListAdapter = new AddressListAdapter(getLayoutInflater(), mProvinceItemClickListener);
        oneView.setAdapter(mOneListAdapter);

        twoView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
        twoView.setLayoutManager(new LinearLayoutManager(this));
        mTwoListAdapter = new AddressListAdapter(getLayoutInflater(), mCityItemClickListener);
        twoView.setAdapter(mTwoListAdapter);

        threeView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
        threeView.setLayoutManager(new LinearLayoutManager(this));
        mThreeListAdapter = new AddressListAdapter(getLayoutInflater(), mDistrictItemClickListener);
        threeView.setAdapter(mThreeListAdapter);

        RequestCityListTask requestCityTask = new RequestCityListTask(this, callback);
        requestCityTask.execute();
    }

    private TabLayout.OnTabSelectedListener tabSelectedListener = new TabLayout.OnTabSelectedListener() {

        private int mCurrentPosition;

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            int newPosition = tab.getPosition();
            switch (newPosition) {
                case 1: {
                    if (mTwoList == null) {
                        mTabLayout.getTabAt(mCurrentPosition).select();
                        return;
                    }
                    break;
                }
                case 2: {
                    if (mThreeList == null) {
                        mTabLayout.getTabAt(mCurrentPosition).select();
                        return;
                    }
                    break;
                }
            }
            this.mCurrentPosition = tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    };

    /**
     * 请求服务器数据回来。(我这里是从asset中的json中读取的,模拟从服务器请求。)
     */
    private RequestCityListTask.Callback callback = new RequestCityListTask.Callback() {
        @Override
        public void callback(List<City> cities) {
            mOneList = cities;
            mOneListAdapter.notifyDataSetChanged(mOneList);
        }
    };

    /**
     * 省的item被点击。
     */
    private OnCompatItemClickListener mProvinceItemClickListener = new OnCompatItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            if (mCurrentOneSelect == position) {
                mViewPager.setCurrentItem(1, true);
                return;
            }
            if (mCurrentOneSelect != -1) {
                mOneList.get(mCurrentOneSelect).setSelect(false);
                mOneListAdapter.notifyItemChanged(mCurrentOneSelect);
            }

            mCurrentOneSelect = position;
            mOneList.get(mCurrentOneSelect).setSelect(true);
            mOneListAdapter.notifyItemChanged(mCurrentOneSelect);

            City one = mOneList.get(mCurrentOneSelect);
            mTwoList = one.getCityList();
            if (mTwoList == null || mTwoList.size() == 0) { // 选定一级。
                setResultFinish(one, null, null);
            } else {
                // 更新二级的content和title。
                mTwoListAdapter.notifyDataSetChanged(mTwoList);
                mTabLayout.getTabAt(1).setText(one.getName());
                mViewPager.setCurrentItem(1, true);

                // 三级置空。
                mTabLayout.getTabAt(2).setText(null);
                mThreeList = null;
                mCurrentTwoSelect = -1;
            }
        }
    };

    /**
     * 市的item被点击。
     */
    private OnCompatItemClickListener mCityItemClickListener = new OnCompatItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            if (mCurrentTwoSelect == position) {
                mViewPager.setCurrentItem(2, true);
                return;
            }

            if (mCurrentTwoSelect != -1) {
                mTwoList.get(mCurrentTwoSelect).setSelect(false);
                mTwoListAdapter.notifyItemChanged(mCurrentTwoSelect);
            }

            mCurrentTwoSelect = position;
            mTwoList.get(mCurrentTwoSelect).setSelect(true);
            mTwoListAdapter.notifyItemChanged(mCurrentTwoSelect);

            City two = mTwoList.get(mCurrentTwoSelect);
            mThreeList = two.getCityList();
            if (mThreeList == null || mThreeList.size() == 0) { // 选定二级。
                setResultFinish(mOneList.get(mCurrentOneSelect), two, null);
            } else {
                mThreeListAdapter.notifyDataSetChanged(mThreeList);
                mTabLayout.getTabAt(2).setText(two.getName());
                mViewPager.setCurrentItem(2, true);
            }
        }
    };

    /**
     * 区的item被点击。
     */
    private OnCompatItemClickListener mDistrictItemClickListener = new OnCompatItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            setResultFinish(mOneList.get(mCurrentOneSelect), mTwoList.get(mCurrentTwoSelect), mThreeList.get(position));
        }
    };

    /**
     * 选中。
     */
    private void setResultFinish(City province, City city, City district) {
        ArrayList<City> cityArrayList = new ArrayList<>();
        cityArrayList.add(province);
        if (city != null)
            cityArrayList.add(city);
        if (district != null)
            cityArrayList.add(district);

        Intent intent = new Intent();
        intent.putParcelableArrayListExtra(KEY_OUTPUT_PROVINCE_CITY_DISTRICT, cityArrayList);
        setResult(RESULT_OK, intent);
        finish();
    }

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