package it.michelelacorte.iptvfree.util;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.graphics.PorterDuff;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.graphics.drawable.DrawerArrowDrawable;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import com.miguelcatalan.materialsearchview.MaterialSearchView;
import java.util.ArrayList;
import java.util.List;
import it.michelelacorte.iptvfree.MainActivity;
import it.michelelacorte.iptvfree.R;
import it.michelelacorte.iptvfree.m3u.M3UData;
import it.michelelacorte.iptvfree.sd_reader.FileOperation;
import it.michelelacorte.iptvfree.sd_reader.FileSelector;
import it.michelelacorte.iptvfree.sd_reader.OnHandleFileListener;
import uk.co.deanwild.materialshowcaseview.MaterialShowcaseSequence;
import uk.co.deanwild.materialshowcaseview.ShowcaseConfig;

/**
 * This class provide misc of util method.
 *
 * Created by Michele on 23/04/2016.
 */
public class Utils {

    private static final String[] mFileFilter = {".m3u", ".m3u8"};
    private static String loadedFromURLString = null;

    /**
     * This method convert two List of channelName and channelString into List of M3UData object.
     * @param channelName List<String>
     * @param channelLink List<String>
     * @return m3uDatas List<M3UData>
     */
    public static List<M3UData> convertToM3UData(List<String> channelName, List<String> channelLink)
    {
        List<M3UData> m3uDatas = new ArrayList<>();
        for(int i = 0; i < channelLink.size(); i++)
        {
           m3uDatas.add(new M3UData(channelName.get(i), channelLink.get(i)));
        }
        return m3uDatas;
    }

    /**
     * Check if device is online.
     * @param context Context
     * @return boolean
     */
    public static boolean isOnline(Context context) {
        ConnectivityManager cm =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnectedOrConnecting();
    }

    /**
     * Check if package is installed on device
     * @param packagename String
     * @param packageManager PackageManager
     * @return boolean
     */
    public static boolean isPackageInstalled(String packagename, PackageManager packageManager) {
        try {
            packageManager.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            return false;
        }
    }

    /**
     * Get system information for bug report
     * @return String
     */
    public static String getSystemInformation()
    {
        return  "SDK: " + Build.VERSION.SDK_INT + "\n" +
                "RELEASE: " + Build.VERSION.RELEASE + "\n" +
                "DEVICE: " + Build.DEVICE + "\n" +
                "OS VERSION: " + System.getProperty("os.version") + "\n" +
                "OS NAME: " + System.getProperty("os.name") + "\n" +
                "MODEL: " + Build.MODEL + "\n" +
                "PRODUCT: " + Build.PRODUCT + "\n"+
                "BRAND: " + Build.BRAND + "\n" +
                "HARDWARE: " + Build.HARDWARE + "\n" +
                "BOARD: " + Build.BOARD + "\n";
    }

    /**
     * This method is for select botch URL or Folder
     * @param activity Activity
     */
    public static void addFromURLOrFolder(final Activity activity)
    {
        final AlertDialog.Builder loaderDialog = new AlertDialog.Builder(activity, R.style.AlertDialogCustom);
        CharSequence items[] = new CharSequence[] {activity.getResources().getString(R.string.dialog_loader_choose_from_file),
                   activity.getResources().getString(R.string.dialog_loader_choose_from_url)};
        loaderDialog.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface d, int n) {
                switch (n)
                {
                    case 0:
                        OnHandleFileListener mLoadFileListener = MainActivity.onHandleFileListener(activity);
                        new FileSelector(activity, FileOperation.LOAD, mLoadFileListener, mFileFilter).show();
                        d.dismiss();
                        break;
                    case 1:
                        loadFromURL(activity);
                        d.dismiss();
                        break;
                    default:
                        break;
                }
            }

        });
        loaderDialog.setNegativeButton(activity.getResources().getString(R.string.dialog_loader_cancel), null);
        loaderDialog.setTitle(activity.getResources().getString(R.string.dialog_loader_choose));
        loaderDialog.show();
    }

    /**
     * Load from URL
     * @param activity Activity
     */
    private static void loadFromURL(final Activity activity)
    {
        AlertDialog.Builder alert = new AlertDialog.Builder(activity, R.style.AlertDialogCustom);
        alert.setTitle(activity.getResources().getString(R.string.dialog_loader_choose_from_url));
        alert.setMessage(activity.getResources().getString(R.string.dialog_loader_url));

        final EditText input = new EditText(activity.getApplicationContext());
        input.setTextColor(ContextCompat.getColor(activity.getApplicationContext(), android.R.color.black));
        input.getBackground().mutate().setColorFilter(ContextCompat.getColor(activity.getApplicationContext(), R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
        alert.setView(input);

        alert.setPositiveButton(activity.getResources().getString(R.string.dialog_loader_open), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                loadedFromURLString = input.getEditableText().toString();
                MainActivity.isMyListLoadedFromURL = true;
                MainActivity.isMyListLoadedFromPath = false;
                Log.e("isMy", "" + MainActivity.isMyListLoadedFromURL + "   " + MainActivity.isMyListLoadedFromPath);
                Toast.makeText(activity, activity.getResources().getString(R.string.dialog_loader_load) + ": " + loadedFromURLString, Toast.LENGTH_SHORT).show();

            }
        });
        alert.setNegativeButton(activity.getResources().getString(R.string.dialog_loader_cancel), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                dialog.cancel();
            }
        });
        AlertDialog alertDialog = alert.create();
        alertDialog.show();
    }

    /**
     * Get URL insered from user.
     * @return String
     */
    public static String getLoadedFromURLString() {
        return loadedFromURLString;
    }

    /**
     * Clear a series of List
     * @param lists List<?>
     */
    public static void clearIfNotEmpty(List<?> ... lists)
    {
        for(List<?> list : lists)
        {
            if(list != null) {
                if (list.size() > 0) {
                    list.clear();
                    list = new ArrayList<>(list);
                }
            }
        }
    }

    /**
     * Tutorial view method
     * @param activity Activity
     * @param SHOWCASE_ID String
     * @param toolbar Toolbar
     * @param floatingActionButton Floating Action Button
     * @param tabLayout TabLayout
     * @param viewPager ViewPager
     * @param searchView MaterialSearchView
     */
    public static void tutorialView(Activity activity, String SHOWCASE_ID, Toolbar toolbar, FloatingActionButton floatingActionButton
    , TabLayout tabLayout, ViewPager viewPager, MaterialSearchView searchView)
    {
        ShowcaseConfig config = new ShowcaseConfig();
        config.setDelay(500);

        MaterialShowcaseSequence sequence = new MaterialShowcaseSequence(activity, SHOWCASE_ID);

        sequence.setConfig(config);

        sequence.addSequenceItem(getNavButtonInToolBar(toolbar),
                activity.getResources().getString(R.string.intro_navbar), activity.getResources().getString(R.string.intro_understand));

        sequence.addSequenceItem(floatingActionButton,
                activity.getResources().getString(R.string.intro_fab), activity.getResources().getString(R.string.intro_understand));

        sequence.addSequenceItem(tabLayout,
                activity.getResources().getString(R.string.intro_tab_1), activity.getResources().getString(R.string.intro_understand));

        sequence.addSequenceItem(tabLayout,
                activity.getResources().getString(R.string.intro_tab_2), activity.getResources().getString(R.string.intro_understand));

        sequence.addSequenceItem(searchView,
                activity.getResources().getString(R.string.intro_search), activity.getResources().getString(R.string.intro_understand));
        sequence.start();
    }

    /**
     * Get hamburger icon on navigation drawer
     * @param toolbar Toolbar
     * @return View
     */
    private static View getNavButtonInToolBar(Toolbar toolbar) {
        for (int i = 0;i<toolbar.getChildCount();i++) {
            if(toolbar.getChildAt(i) instanceof ImageButton){
                ImageButton button = (ImageButton) toolbar.getChildAt(i);
                if(button.getDrawable().getClass().getSuperclass().equals(DrawerArrowDrawable.class))
                    return toolbar.getChildAt(i);
            }
        }
        return null;
    }
}