package io.emqtt.emqandroidtoolkit.util;

import io.emqtt.emqandroidtoolkit.model.Subscription;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import io.realm.RealmObject;
import io.realm.RealmResults;

/**
 * ClassName: RealmHelper
 * Desc:
 * Created by zhiw on 2017/3/29.
 */

public class RealmHelper {

    private static RealmHelper INSTANCE;

    private Realm mRealm;

    public static RealmHelper getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new RealmHelper();
        }
        return INSTANCE;
    }

    private RealmHelper() {
        try {
            mRealm = Realm.getDefaultInstance();
        } catch (Exception e) {
            RealmConfiguration config = new RealmConfiguration.Builder()
                    .deleteRealmIfMigrationNeeded()
                    .build();
            mRealm = Realm.getInstance(config);
        }


    }

    public <T extends RealmObject> void addData(T data) {
        mRealm.beginTransaction();
        mRealm.copyToRealm(data);
        mRealm.commitTransaction();
    }

    public void addSubscription(final Subscription data) {
        String topic = data.getTopic();
        final Subscription subscription = mRealm.where(data.getClass()).equalTo("topic", topic).findFirst();
        if (subscription != null) {
            mRealm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    subscription.setQoS(data.getQoS());
                }
            });

        } else {
            mRealm.beginTransaction();
            mRealm.copyToRealm(data);
            mRealm.commitTransaction();
        }

    }

    public <T extends RealmObject> T queryFirst(Class<T> clazz) {
        return mRealm.where(clazz).findFirst();
    }

    public <T extends RealmObject> RealmResults<T> queryAll(Class<T> clazz) {
        return mRealm.where(clazz).findAll();
    }

    public <T extends RealmObject> RealmResults<T> queryTopicMessage(Class<T> clazz, String topic) {
        return mRealm.where(clazz).equalTo("topic", topic).findAll();
    }

    public <T extends RealmObject> T queryFirstTopicMessage(Class<T> clazz, String topic) {
        return mRealm.where(clazz).equalTo("topic", topic).findFirst();
    }


    public <T extends RealmObject> void delete(T data) {
        mRealm.beginTransaction();
        data.deleteFromRealm();
        mRealm.commitTransaction();
    }

    public <T extends RealmObject> void deleteAll(Class<T> clazz) {
        final RealmResults results = mRealm.where(clazz).findAll();
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                results.deleteAllFromRealm();

            }
        });
    }

    public <T extends RealmObject> void deleteTopicMessage(Class<T> clazz, String topic) {
        final RealmResults results = mRealm.where(clazz)
                .equalTo("topic", topic)
                .findAll();
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                results.deleteAllFromRealm();

            }
        });
    }

    public <T extends RealmObject> void deleteTopic(Class<T> clazz, String id) {
        final RealmResults results = mRealm.where(clazz)
                .equalTo("connectionId", id)
                .findAll();
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                results.deleteAllFromRealm();

            }
        });
    }


    public Realm getRealm() {
        return mRealm;
    }
}