package allen.town.podcast.core.sync;

import android.util.Log;

import androidx.collection.ArrayMap;
import androidx.core.util.Pair;

import java.util.List;
import java.util.Map;

import allen.town.podcast.sync.model.EpisodeAction;

public class EpisodeActionFilter {

    public static final String TAG = "EpisodeActionFilter";

    public static Map<Pair<String, String>, EpisodeAction> getRemoteActionsOverridingLocalActions(
            List<EpisodeAction> remoteActions,
            List<EpisodeAction> queuedEpisodeActions) {
        // make sure more recent local actions are not overwritten by older remote actions
        Map<Pair<String, String>, EpisodeAction> remoteActionsThatOverrideLocalActions = new ArrayMap<>();
        Map<Pair<String, String>, EpisodeAction> localMostRecentPlayActions =
                createUniqueLocalMostRecentPlayActions(queuedEpisodeActions);
        for (EpisodeAction remoteAction : remoteActions) {
            Pair<String, String> key = new Pair<>(remoteAction.getPodcast(), remoteAction.getEpisode());
            switch (remoteAction.getAction()) {
                case NEW:
                    remoteActionsThatOverrideLocalActions.put(key, remoteAction);
                    break;
                case DOWNLOAD:
                    break;
                case PLAY:
                    EpisodeAction localMostRecent = localMostRecentPlayActions.get(key);
                    if (secondActionOverridesFirstAction(remoteAction, localMostRecent)) {
                        break;
                    }
                    EpisodeAction remoteMostRecentAction = remoteActionsThatOverrideLocalActions.get(key);
                    if (secondActionOverridesFirstAction(remoteAction, remoteMostRecentAction)) {
                        break;
                    }
                    remoteActionsThatOverrideLocalActions.put(key, remoteAction);
                    break;
                case DELETE:
                    // NEVER EVER call DBWriter.deleteFeedMediaOfItem() here, leads to an infinite loop
                    break;
                default:
                    Log.e(TAG, "Unknown remoteAction: " + remoteAction);
                    break;
            }
        }

        return remoteActionsThatOverrideLocalActions;
    }

    private static Map<Pair<String, String>, EpisodeAction> createUniqueLocalMostRecentPlayActions(
            List<EpisodeAction> queuedEpisodeActions) {
        Map<Pair<String, String>, EpisodeAction> localMostRecentPlayAction;
        localMostRecentPlayAction = new ArrayMap<>();
        for (EpisodeAction action : queuedEpisodeActions) {
            Pair<String, String> key = new Pair<>(action.getPodcast(), action.getEpisode());
            EpisodeAction mostRecent = localMostRecentPlayAction.get(key);
            if (mostRecent == null || mostRecent.getTimestamp() == null) {
                localMostRecentPlayAction.put(key, action);
            } else if (mostRecent.getTimestamp().before(action.getTimestamp())) {
                localMostRecentPlayAction.put(key, action);
            }
        }
        return localMostRecentPlayAction;
    }

    private static boolean secondActionOverridesFirstAction(EpisodeAction firstAction,
                                                            EpisodeAction secondAction) {
        return secondAction != null
                && secondAction.getTimestamp() != null
                && secondAction.getTimestamp().after(firstAction.getTimestamp());
    }

}
