package com.nirhart.shortrain.utils;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.Rect;
import android.graphics.drawable.Icon;
import android.os.PersistableBundle;

import com.nirhart.shortrain.R;
import com.nirhart.shortrain.rail.RailActionActivity;
import com.nirhart.shortrain.rail.RailInfo;
import com.nirhart.shortrain.train.TrainActionActivity;

import java.util.ArrayList;
import java.util.List;

import static com.nirhart.shortrain.rail.RailActionActivity.RAIL_RECT_KEY;
import static com.nirhart.shortrain.rail.RailActionActivity.RAIL_ROTATION_KEY;

public class ShortcutsUtils {

    public static ShortcutInfo createTrainShortcut(Context context) {
        Intent trainIntent = new Intent();
        trainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_ANIMATION);
        trainIntent.setAction(Intent.ACTION_VIEW);
        trainIntent.setComponent(new ComponentName(context.getPackageName(), TrainActionActivity.class.getName()));
        trainIntent.putExtra(TrainActionActivity.TRAIN_ID_KEY, TrainActionActivity.TRAIN_ID_VALUE);

        return new ShortcutInfo.Builder(context, TrainActionActivity.TRAIN_ID_VALUE)
                .setShortLabel(" ")
                .setLongLabel(context.getString(R.string.start_point))
                .setRank(1)
                .setIcon(Icon.createWithResource(context, R.drawable.start_point))
                .setIntent(trainIntent)
                .build();
    }

    public static ShortcutInfo createRailShortcut(Context context, int railNumber) {
        return createRailShortcut(context, railNumber, R.drawable.not_ready_rail, RailInfo.NOT_SET, null);
    }

    public static ShortcutInfo createRailShortcut(Context context, int railNumber, int iconResId, int rotation, Rect iconRect) {
        Intent railIntent = new Intent();
        railIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_ANIMATION);
        railIntent.setAction(Intent.ACTION_VIEW);
        railIntent.setComponent(new ComponentName(context.getPackageName(), RailActionActivity.class.getName()));
        railIntent.putExtra(RailActionActivity.RAIL_ID_KEY, RailActionActivity.NEW_RAIL_ID_VALUE + railNumber);
        railIntent.putExtra(RailActionActivity.RAIL_ROTATION_KEY, rotation);


        PersistableBundle persistableBundle = null;
        if (iconRect != null) {
            persistableBundle = new PersistableBundle();
            persistableBundle.putIntArray(RAIL_RECT_KEY, new int[]{iconRect.left, iconRect.top});
            persistableBundle.putInt(RAIL_ROTATION_KEY, rotation);
        }

        ShortcutInfo.Builder builder = new ShortcutInfo.Builder(context, RailActionActivity.NEW_RAIL_ID_VALUE + railNumber)
                .setShortLabel(" ")
                .setLongLabel(context.getString(R.string.add_rail))
                .setRank(2)
                .setIcon(Icon.createWithResource(context, iconResId))
                .setIntent(railIntent);

        if (persistableBundle != null) {
            builder.setExtras(persistableBundle);
        }

        return builder.build();
    }

    private static boolean isRailShortcut(String shortcutId) {
        return shortcutId.startsWith(RailActionActivity.NEW_RAIL_ID_VALUE);
    }

    public static int getRailNumber(String railId) {
        return Integer.parseInt(railId.substring(RailActionActivity.NEW_RAIL_ID_VALUE.length()));
    }

    public static int getNextRailNumber(ShortcutManager shortcutManager) {
        List<ShortcutInfo> shortcuts = shortcutManager.getPinnedShortcuts();

        int newRailId = -1;

        for (ShortcutInfo shortcutInfo : shortcuts) {
            String id = shortcutInfo.getId();
            if (isRailShortcut(id)) {
                int railId = getRailNumber(id);
                if (railId > newRailId) {
                    newRailId = railId;
                }
            }
        }

        newRailId++;

        return newRailId;
    }

    public static List<RailInfo> getRails(ShortcutManager shortcutManager) {
        List<ShortcutInfo> shortcuts = shortcutManager.getPinnedShortcuts();

        List<RailInfo> rails = new ArrayList<>();
        for (ShortcutInfo shortcutInfo : shortcuts) {
            String id = shortcutInfo.getId();
            if (isRailShortcut(id)) {
                PersistableBundle extras = shortcutInfo.getExtras();
                if (extras != null) {
                    int[] posArray = extras.getIntArray(RailActionActivity.RAIL_RECT_KEY);
                    int rotation = extras.getInt(RailActionActivity.RAIL_ROTATION_KEY);
                    assert posArray != null;
                    rails.add(new RailInfo(posArray[0], posArray[1], rotation));
                }
            }
        }

        return rails;
    }
}