package com.matteolobello.launcher.ui.fragment;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;

import com.matteolobello.launcher.data.loader.ShortcutsLoader;
import com.matteolobello.launcher.data.model.DockIcon;
import com.matteolobello.launcher.data.preference.DockAppsHelper;
import com.matteolobello.launcher.ui.activity.LauncherActivity;
import com.matteolobello.launcher.ui.dialog.SelectDockIconDialog;
import com.matteolobello.launcher.ui.fragment.base.DockFragment;
import com.matteolobello.launcher.util.IconUtil;
import com.matteolobello.launcher.util.IntentUtil;

import java.util.ArrayList;

public class HomeScreenDockFragment extends DockFragment {

    private final ApplicationInfo[] DOCK_ITEMS_APPLICATION_INFO_ARRAY = new ApplicationInfo[LauncherActivity.APP_DRAWER_COLUMNS];

    private Animation mDockIconsEditAnimation;

    @Override
    public void init(View rootView) {
        super.init(rootView);

        setupDockIcons();
    }

    public void setupDockIcons() {
        ArrayList<DockIcon> orderedDockItemPackagesArrayList = DockAppsHelper.get().getOrderedDockIcons(getContext());
        if (orderedDockItemPackagesArrayList == null || orderedDockItemPackagesArrayList.size() == 0) {
            return;
        }

        for (DockIcon dockIcon : orderedDockItemPackagesArrayList) {
            String packageName = dockIcon.getPackageName();
            if (packageName == null) {
                return;
            }

            try {
                ApplicationInfo applicationInfo = getContext().getPackageManager().getApplicationInfo(packageName, 0);

                DOCK_ITEMS_APPLICATION_INFO_ARRAY[dockIcon.getColumn()] = applicationInfo;

                View dockItemView = getItemAtColumn(dockIcon.getColumn());
                dockItemView.post(() -> {
                    IconUtil.setIconOnImageView(getLauncherActivity(),
                            ((ImageView) ((ViewGroup) dockItemView).getChildAt(0)), applicationInfo);

                    dockItemView.setOnClickListener(view -> IntentUtil.launchApp(view, packageName));

                    dockItemView.setOnLongClickListener(view -> {
                        getLauncherActivity().showShortcutsBottomSheet(applicationInfo.packageName,
                                ShortcutsLoader.loadShortcuts(getContext(), applicationInfo.packageName));

                        return !getLauncherActivity().isExpandingAppDrawer();
                    });
                });
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    public void startIconsEditing() {
        mDockIconsEditAnimation = new AlphaAnimation(0.4f, 1.0f);
        mDockIconsEditAnimation.setDuration(260);
        mDockIconsEditAnimation.setRepeatMode(Animation.REVERSE);
        mDockIconsEditAnimation.setRepeatCount(Animation.INFINITE);

        iterateOverDockIcons((dockItem, dockIconColumn) -> {
            dockItem.setOnClickListener(view -> showSelectAppForIconAtColumn(dockIconColumn));

            dockItem.startAnimation(mDockIconsEditAnimation);
        });
    }

    public void stopEditAnimation() {
        if (mDockIconsEditAnimation != null) {
            mDockIconsEditAnimation.cancel();
        }

        iterateOverDockIcons((dockItem, dockIconColumn) -> {
            ApplicationInfo applicationInfo = DOCK_ITEMS_APPLICATION_INFO_ARRAY[dockIconColumn];
            if (applicationInfo == null) {
                return;
            }

            dockItem.setOnClickListener(view -> IntentUtil.launchApp(dockItem, applicationInfo.packageName));
        });
    }

    public boolean isEditing() {
        return mDockIconsEditAnimation != null && mDockIconsEditAnimation.isInitialized();
    }

    public final void saveApplicationItemForColumn(ApplicationInfo applicationInfo, int column) {
        DOCK_ITEMS_APPLICATION_INFO_ARRAY[column] = applicationInfo;

        DockAppsHelper.get().saveItem(getContext(), applicationInfo.packageName, column);
    }

    private void showSelectAppForIconAtColumn(int dockIconColumn) {
        SelectDockIconDialog.show(getLauncherActivity(), dockIconColumn);
    }
}