package com.nodlee.theogony.core;

import com.nodlee.theogony.bean.Champion;
import com.nodlee.theogony.bean.Favorites;
import com.nodlee.theogony.thirdparty.realm.RealmProvider;

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

import io.realm.Realm;
import io.realm.RealmResults;

/**
 * Created by Vernon Lee on 15-12-8.
 */
public class FavoritesManager {
    private static FavoritesManager sFavoriteChampionManager;

    private FavoritesManager() {
    }

    public static FavoritesManager getInstance() {
        if (sFavoriteChampionManager == null) {
            sFavoriteChampionManager = new FavoritesManager();
        }
        return sFavoriteChampionManager;
    }

    public List<Champion> getAll() {
        Realm realm = RealmProvider.getInstance().getRealm();
        try {
            RealmResults<Favorites> results = realm.where(Favorites.class).findAll();
            return toChampions(realm.copyFromRealm(results));
        } finally {
            realm.close();
        }
    }

    private List<Champion> toChampions(List<Favorites> data) {
        if (data == null) return null;

        List<Champion> champions = new ArrayList<>();
        for (Favorites favorites : data) {
            champions.add(favorites.getChampion());
        }
        return champions;
    }

    public void add(final Champion champion) {
        if (champion == null) return;
        Realm realm = RealmProvider.getInstance().getRealm();
        try {
            realm.beginTransaction();

            int primaryKey = 0;
            Number number = realm.where(Favorites.class).max("id");
            if (number != null) {
                primaryKey = number.intValue() + 1;
            } else {
                primaryKey = 1;
            }
            Favorites favorites = realm.createObject(Favorites.class, primaryKey);
            favorites.setChampionId(champion.getId());
            favorites.setChampion(champion);

            realm.commitTransaction();
        } finally {
            realm.close();
        }
    }

    public void remove(final Champion champion) {
        if (champion == null) return;
        Realm realm = RealmProvider.getInstance().getRealm();
        try {
            realm.beginTransaction();
            Favorites favorites = realm.where(Favorites.class)
                    .equalTo("championId", champion.getId())
                    .findFirst();
            if (favorites != null) {
                favorites.deleteFromRealm();
            }
            realm.commitTransaction();
        } finally {
            realm.close();
        }
    }

    public boolean isFavorite(Champion champion) {
        if (champion == null) return false;
        Realm realm = RealmProvider.getInstance().getRealm();
        try {
            RealmResults<Favorites> results = realm.where(Favorites.class)
                    .equalTo("championId", champion.getId()).findAll();
            return results != null && results.size() >= 1;
        } finally {
            realm.close();
        }
    }
}