/*
 * Copyright (C) 2014-2018 Mikhail Kulesh
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU
 * General Public License as published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details. You should have received a copy of the GNU General
 * Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.mkulesh.micromath.fman;

import android.net.Uri;
import android.os.Build;
import android.util.TypedValue;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.mkulesh.micromath.plus.R;
import com.mkulesh.micromath.utils.ViewUtils;

public class FileListView implements AdapterView.OnItemClickListener
{
    private final Commander commander;
    public final ListView listView;
    private final LinearLayout statusPanel;
    private final View statusPanelDivider;
    private final TextView statusBar;

    private int currentPosition = -1;
    public int adapterMode = 0;

    FileListView(Commander c)
    {
        commander = c;
        listView = commander.findViewById(R.id.fman_list_view);
        listView.setItemsCanFocus(false);
        listView.setFocusableInTouchMode(true);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setOnItemClickListener(this);
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        {
            TypedValue outValue = new TypedValue();
            commander.getContext().getTheme().resolveAttribute(R.attr.selectableItemBackground, outValue, true);
            listView.setSelector(outValue.resourceId);
        }
        commander.registerForContextMenu(listView);
        statusPanel = commander.findViewById(R.id.fman_status_panel);
        statusPanelDivider = commander.findViewById(R.id.fman_status_panel_divider);
        statusBar = commander.findViewById(R.id.fman_status_bar);
    }

    public final AdapterIf getListAdapter()
    {
        return (AdapterIf) listView.getAdapter();
    }

    public final void Navigate(Uri uri, String posTo)
    {
        try
        {
            currentPosition = -1;
            listView.clearChoices();
            listView.invalidateViews();
            AdapterIf ca_new = null, ca = (AdapterIf) listView.getAdapter();
            String scheme = uri.getScheme();
            if (scheme == null)
            {
                scheme = "";
            }
            if (ca == null || !scheme.equals(ca.getScheme()))
            {
                ca_new = commander.CreateAdapter(uri);
                listView.setAdapter((ListAdapter) ca_new);
                applySettings();
                ca = ca_new;
            }
            ca.setMode(AdapterIf.MODE_SORTING | AdapterIf.MODE_SORT_DIR, adapterMode);
            ca.readSource(uri, Integer.toBinaryString(0) + (posTo == null ? "" : posTo));
            statusPanel.setVisibility((ca instanceof AdapterHome) ? View.GONE : View.VISIBLE);
            statusPanelDivider.setVisibility(statusPanel.getVisibility());
            statusBar.setText(ca.toString());
            ViewUtils.Debug(this, "Current directory: " + ca.getUri().getPath());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public final void applySettings()
    {
        try
        {
            AdapterIf ca = (AdapterIf) listView.getAdapter();
            if (ca == null)
                return;

            ca.setMode(AdapterIf.MODE_SORTING, AdapterIf.SORT_NAME);

            if (ca instanceof AdapterHome)
                ca.setMode(AdapterIf.MODE_ROOT, AdapterIf.BASIC_MODE);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public final void refreshList(String posto)
    {
        try
        {
            AdapterIf ca = (AdapterIf) listView.getAdapter();
            if (ca == null)
                return;
            listView.clearChoices();
            String cookie = Integer.toString(0);
            if (posto != null)
                cookie += posto;
            ca.readSource(null, cookie);
            listView.invalidateViews();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public final void askRedrawList()
    {
        listView.invalidateViews();
    }

    public final void setSelection(int i, int y_)
    {
        final ListView flv$ = listView;
        final int position$ = i, y$ = y_;
        flv$.post(new Runnable()
        {
            public void run()
            {
                flv$.setSelectionFromTop(position$, y$ > 0 ? y$ : flv$.getHeight() / 2);
            }
        });
        currentPosition = i;
    }

    public final void setSelection(String name)
    {
        AdapterIf ca = (AdapterIf) listView.getAdapter();
        if (ca != null)
        {
            int i, num = ((ListAdapter) ca).getCount();
            for (i = 0; i < num; i++)
            {
                String item_name = ca.getItemName(i, false);
                if (item_name != null && item_name.compareTo(name) == 0)
                {
                    setSelection(i, listView.getHeight() / 2);
                    break;
                }
            }
        }
    }

    public final int getSelected()
    {
        int pos = listView.getSelectedItemPosition();
        if (pos != AdapterView.INVALID_POSITION)
            return currentPosition = pos;
        return currentPosition;
    }

    public final void recoverAfterRefresh(String item_name)
    {
        try
        {
            if (FileUtils.str(item_name))
                setSelection(item_name);
            else
                setSelection(currentPosition > 0 ? currentPosition : 0, 0);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
     * An AdapterView.OnItemClickListener implementation
     */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        currentPosition = position;
        AdapterIf ca = (AdapterIf) listView.getAdapter();
        ca.openItem(position);
    }
}