package com.folioreader.ui.folio.fragment;

import android.app.Dialog;
import android.app.SearchManager;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.folioreader.Constants;
import com.folioreader.R;
import com.folioreader.model.dictionary.Dictionary;
import com.folioreader.model.dictionary.Wikipedia;
import com.folioreader.ui.base.DictionaryCallBack;
import com.folioreader.ui.base.DictionaryTask;
import com.folioreader.ui.base.WikipediaCallBack;
import com.folioreader.ui.base.WikipediaTask;
import com.folioreader.ui.folio.adapter.DictionaryAdapter;

import java.io.IOException;

/**
 * @author gautam chibde on 4/7/17.
 */

public class DictionaryFragment extends DialogFragment implements DictionaryCallBack, WikipediaCallBack {

    private static final String TAG = "DictionaryFragment";

    private String word;

    private MediaPlayer mediaPlayer;
    private RecyclerView dictResults;
    private TextView noNetwork, dictionary, wikipedia, wikiWord, def;
    private ProgressBar progressBar;
    private Button googleSearch;
    private LinearLayout wikiLayout;
    private WebView wikiWebView;
    private DictionaryAdapter mAdapter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
        word = getArguments().getString(Constants.SELECTED_WORD);
        mediaPlayer = new MediaPlayer();
    }

    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.layout_dictionary, container);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        noNetwork = (TextView) view.findViewById(R.id.no_network);
        progressBar = (ProgressBar) view.findViewById(R.id.progress);
        dictResults = (RecyclerView) view.findViewById(R.id.rv_dict_results);

        googleSearch = (Button) view.findViewById(R.id.btn_google_search);
        dictionary = (TextView) view.findViewById(R.id.btn_dictionary);
        wikipedia = (TextView) view.findViewById(R.id.btn_wikipedia);

        wikiLayout = (LinearLayout) view.findViewById(R.id.ll_wiki);
        wikiWord = (TextView) view.findViewById(R.id.tv_word);
        def = (TextView) view.findViewById(R.id.tv_def);
        wikiWebView = (WebView) view.findViewById(R.id.wv_wiki);
        wikiWebView.getSettings().setLoadsImagesAutomatically(true);
        wikiWebView.setWebViewClient(new WebViewClient());
        wikiWebView.getSettings().setJavaScriptEnabled(true);
        wikiWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        dictionary.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadDictionary();
            }
        });

        wikipedia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadWikipedia();
            }
        });

        googleSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                intent.putExtra(SearchManager.QUERY, word);
                startActivity(intent);
            }
        });

        view.findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        dictResults.setLayoutManager(new LinearLayoutManager(getActivity()));
        mAdapter = new DictionaryAdapter(getActivity(), this);
        loadDictionary();
    }

    private void loadDictionary() {
        if(noNetwork.getVisibility() == View.VISIBLE || googleSearch.getVisibility() == View.VISIBLE) {
            noNetwork.setVisibility(View.GONE);
            googleSearch.setVisibility(View.GONE);
        }
        wikiWebView.loadUrl("about:blank");
        mAdapter.clear();
        dictionary.setSelected(true);
        wikipedia.setSelected(false);
        wikiLayout.setVisibility(View.GONE);
        dictResults.setVisibility(View.VISIBLE);
        DictionaryTask task = new DictionaryTask(this);
        String baseUrl = Constants.DICTIONARY_BASE_URL + word.trim();
        task.execute(baseUrl);
    }

    private void loadWikipedia() {
        if(noNetwork.getVisibility() == View.VISIBLE || googleSearch.getVisibility() == View.VISIBLE) {
            noNetwork.setVisibility(View.GONE);
            googleSearch.setVisibility(View.GONE);
        }
        wikiWebView.loadUrl("about:blank");
        mAdapter.clear();
        wikiLayout.setVisibility(View.VISIBLE);
        dictResults.setVisibility(View.GONE);
        dictionary.setSelected(false);
        wikipedia.setSelected(true);
        WikipediaTask task = new WikipediaTask(this);
        task.execute(Constants.WIKIPEDIA_API_URL + word.trim());
    }

    @Override
    public void onError() {
        noNetwork.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);
        noNetwork.setText("offline");
        googleSearch.setVisibility(View.GONE);
    }

    @Override
    public void onDictionaryDataReceived(Dictionary dictionary) {
        progressBar.setVisibility(View.GONE);
        if (dictionary.getResults().isEmpty()) {
            noNetwork.setVisibility(View.VISIBLE);
            googleSearch.setVisibility(View.VISIBLE);
            noNetwork.setText("Word not found");
        } else {
            mAdapter.setResults(dictionary.getResults());
            dictResults.setAdapter(mAdapter);
        }
    }

    @Override
    public void onWikipediaDataReceived(Wikipedia wikipedia) {
        wikiWord.setText(wikipedia.getWord());
        if (wikipedia.getDefinition().trim().isEmpty()) {
            def.setVisibility(View.GONE);
        } else {
            String definition = "\"" +
                    wikipedia.getDefinition() +
                    "\"";
            def.setText(definition);
        }
        wikiWebView.loadUrl(wikipedia.getLink());
    }

    //TODO
    @Override
    public void playMedia(String url) {
        if (mediaPlayer != null) {
            try {
                mediaPlayer.setDataSource(url);
                mediaPlayer.prepare();
                mediaPlayer.start();
            } catch (IOException e) {
                Log.e(TAG, "playMedia failed", e);
            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        Dialog d = getDialog();
        if (d != null) {
            d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}
