/*
 * Created by LuaView.
 * Copyright (c) 2017, Alibaba Group. All rights reserved.
 *
 * This source code is licensed under the MIT.
 * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
 */

package com.taobao.luaview.view;

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;

import com.taobao.luaview.userdata.base.UDLuaTable;
import com.taobao.luaview.userdata.list.UDBaseListView;
import com.taobao.luaview.userdata.list.UDListView;
import com.taobao.luaview.userdata.ui.UDView;
import com.taobao.luaview.util.LuaViewUtil;
import com.taobao.luaview.view.adapter.LVListViewAdapter;
import com.taobao.luaview.view.interfaces.ILVListView;

import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;

import java.util.ArrayList;

/**
 * LuaView - ListView
 *
 * @author song
 * @date 15/8/20
 */
public class LVListView extends ListView implements ILVListView {
    UDBaseListView mLuaUserdata;

    //adapter
    LVListViewAdapter mAdapter;

    //header & footer container
    LVViewGroup mHeaderContainer;
    LVViewGroup mFooterContainer;

    public LVListView(Globals globals, LuaValue metaTable, Varargs varargs, UDBaseListView udBaseListView) {
        super(globals.getContext());
        this.mLuaUserdata = udBaseListView != null ? udBaseListView : new UDListView(this, globals, metaTable, varargs);
        init(globals);
    }

    private void init(Globals globals) {
        globals.saveContainer(this);
        initData(globals);
        globals.restoreContainer();
    }

    /**
     * 初始化子元素
     */
    void initData(Globals globals) {
        mAdapter = new LVListViewAdapter(globals, mLuaUserdata);
        this.setAdapter(mAdapter);
        this.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 UDLuaTable cellData = (UDLuaTable) view.getTag();
                 int row = position - LVListView.this.getHeaderViewsCount();
                mAdapter.onCellClicked(cellData, row);
            }
        });
        this.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                 UDLuaTable cellData = (UDLuaTable) view.getTag();
                 int row = position - LVListView.this.getHeaderViewsCount();
                return mAdapter.onCellLongClicked(cellData, row);
            }
        });
        this.setSelector(android.R.color.transparent);
        this.setDivider(new ColorDrawable(Color.TRANSPARENT));//设置divider颜色透明
        mLuaUserdata.initOnScrollCallback(this);
    }


    void initHeaderContainer() {
        mHeaderContainer = new LVViewGroup(mLuaUserdata.getGlobals(), mLuaUserdata.getmetatable(), null);
        mHeaderContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        this.addHeaderView(mHeaderContainer);
        this.setHeaderDividersEnabled(false);
    }

    void initFooterContainer() {
        mFooterContainer = new LVViewGroup(mLuaUserdata.getGlobals(), mLuaUserdata.getmetatable(), null);
        mFooterContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        this.addFooterView(mFooterContainer);
        this.setFooterDividersEnabled(false);
    }

    @Override
    public UDView getUserdata() {
        return mLuaUserdata;
    }

    @Override
    public void setChildNodeViews(ArrayList<UDView> childNodeViews) {

    }

    @Override
    public BaseAdapter getLVAdapter() {
        return mAdapter;
    }

    @Override
    public void addHeader(View view) {
        if (mHeaderContainer == null) {
            initHeaderContainer();
        }
        LuaViewUtil.addView(mHeaderContainer, view, null);
    }

    @Override
    public void removeHeader() {
        if (mHeaderContainer != null) {
            mHeaderContainer.removeAllViews();
        }
    }

    @Override
    public void addFooter(View view) {
        if (mFooterContainer != null) {
            initFooterContainer();
        }
        LuaViewUtil.addView(mFooterContainer, view, null);
    }

    @Override
    public void removeFooter() {
        if (mFooterContainer != null) {
            mFooterContainer.removeAllViews();
        }
    }
}