package itkach.aard2;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.io.File;

import static android.view.View.OnClickListener;

public class DictionariesFragment extends BaseListFragment {

    private final static String TAG = DictionariesFragment.class.getSimpleName();

    final static int FILE_SELECT_REQUEST = 17;

    private DictionaryListAdapter listAdapter;
    private boolean findDictionariesOnAttach = false;

    private class DiscoveryProgressDialog extends ProgressDialog {

        public DiscoveryProgressDialog(Context context) {
            super(context);
            setIndeterminate(true);
            setCancelable(false);
            setTitle(getString(R.string.dictionaries_please_wait));
            setMessage(getString(R.string.dictionaries_scanning_device));
        }

        @Override
        public void onBackPressed() {
            final Application app = (Application)getActivity().getApplication();
            app.cancelFindDictionaries();
        }
    }


    protected char getEmptyIcon() {
        return IconMaker.IC_DICTIONARY;
    }

    protected CharSequence getEmptyText() {
        return Html.fromHtml(getString(R.string.main_empty_dictionaries));
    }

    @Override
    protected boolean supportsSelection() {
        return false;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        final Application app = (Application)getActivity().getApplication();
        listAdapter = new DictionaryListAdapter(app.dictionaries, getActivity());
        setListAdapter(listAdapter);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View result = super.onCreateView(inflater, container, savedInstanceState);
        View extraEmptyView = inflater.inflate(R.layout.dictionaries_empty_view_extra, container, false);
        Button btn = (Button)extraEmptyView.findViewById(R.id.dictionaries_empty_btn_scan);
        btn.setCompoundDrawablesWithIntrinsicBounds(
                IconMaker.list(getActivity(), IconMaker.IC_RELOAD),
                null, null, null);
        btn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                findDictionaries();
            }
        });
        LinearLayout emptyViewLayout = (LinearLayout)emptyView;
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        emptyViewLayout.addView(extraEmptyView, layoutParams);
        return result;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.dictionaries, menu);
    }

    @Override
    public void onPrepareOptionsMenu(final Menu menu) {
        MenuItem miFindDictionaries = menu.findItem(R.id.action_find_dictionaries);
        FragmentActivity activity = getActivity();
        miFindDictionaries.setIcon(IconMaker.actionBar(activity, IconMaker.IC_RELOAD));
        MenuItem miAddDictionaries = menu.findItem(R.id.action_add_dictionaries);
        miAddDictionaries.setIcon(IconMaker.actionBar(activity, IconMaker.IC_ADD));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_find_dictionaries) {
            findDictionaries();
            return true;
        }
        if (item.getItemId() == R.id.action_add_dictionaries) {
            Intent intent = new Intent(getActivity(), FileSelectActivity.class);
            startActivityForResult(intent, FILE_SELECT_REQUEST);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void findDictionaries() {
        Activity activity = getActivity();
        if (activity == null) {
            this.findDictionariesOnAttach = true;
            return;
        }
        this.findDictionariesOnAttach = false;
        final Application app = ((Application)activity.getApplication());
        final ProgressDialog p = new DiscoveryProgressDialog(getActivity());
        app.findDictionaries(new DictionaryDiscoveryCallback() {
            @Override
            public void onDiscoveryFinished() {
                p.dismiss();
            }
        });
        p.show();
    }



    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (findDictionariesOnAttach) {
            findDictionaries();
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode != FILE_SELECT_REQUEST) {
            Log.d(TAG, "Unknown request code: " + requestCode);
            return;
        }
        String selectedPath = data == null ? null : data.getStringExtra(FileSelectActivity.KEY_SELECTED_FILE_PATH);
        Log.d(TAG, String.format("req code %s, result code: %s, selected: %s", requestCode, resultCode, selectedPath));
        if (resultCode == Activity.RESULT_OK && selectedPath != null && selectedPath.length() > 0) {
            final Application app = ((Application)getActivity().getApplication());
            boolean alreadyExists = app.addDictionary(new File(selectedPath));
            String toastMessage;
            if (alreadyExists) {
                toastMessage = getString(R.string.msg_dictionary_already_open);
            }
            else {
                toastMessage = getString(R.string.msg_dictionary_added, selectedPath);
            }

            Toast.makeText(getActivity(), toastMessage, Toast.LENGTH_LONG).show();
        }
    }
}