package com.fastaccess.data.dao.model;

import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.fastaccess.App;
import com.fastaccess.data.dao.converters.RepoConverter;

import java.util.List;

import io.requery.Column;
import io.requery.Convert;
import io.requery.Entity;
import io.requery.Generated;
import io.requery.Key;
import lombok.NoArgsConstructor;
import rx.Completable;
import rx.Observable;

import static com.fastaccess.data.dao.model.PinnedRepos.ID;
import static com.fastaccess.data.dao.model.PinnedRepos.REPO_FULL_NAME;

/**
 * Created by Kosh on 25 Mar 2017, 7:29 PM
 */

@Entity @NoArgsConstructor public abstract class AbstractPinnedRepos implements Parcelable {
    @Key @Generated long id;
    @Column(unique = true) String repoFullName;
    @Convert(RepoConverter.class) Repo pinnedRepo;

    public static Completable save(@NonNull PinnedRepos entity) {
        return App.getInstance().getDataStore().insert(entity).toCompletable();
    }

    public static boolean pinUpin(@NonNull Repo repo) {
        PinnedRepos pinnedRepos = get(repo.getFullName());
        if (pinnedRepos == null) {
            PinnedRepos pinned = new PinnedRepos();
            pinned.setRepoFullName(repo.getFullName());
            pinned.setPinnedRepo(repo);
            save(pinned).toObservable().toBlocking().firstOrDefault(null);
            return true;
        } else {
            delete(pinnedRepos.getId());
            return false;
        }
    }

    @Nullable public static PinnedRepos get(long id) {
        return App.getInstance().getDataStore().select(PinnedRepos.class)
                .where(ID.eq(id))
                .get()
                .firstOrNull();
    }

    @Nullable public static PinnedRepos get(@NonNull String repoFullName) {
        return App.getInstance().getDataStore().select(PinnedRepos.class)
                .where(REPO_FULL_NAME.eq(repoFullName))
                .get()
                .firstOrNull();
    }

    public static boolean isPinned(@NonNull String repoFullName) {
        return get(repoFullName) != null;
    }

    @NonNull public static Observable<List<PinnedRepos>> getMyPinnedRepos() {
        return App.getInstance().getDataStore().select(PinnedRepos.class)
                .orderBy(ID.desc())
                .get()
                .toObservable()
                .toList();

    }

    public static void delete(long id) {
        App.getInstance().getDataStore().delete(PinnedRepos.class)
                .where(ID.eq(id))
                .get()
                .value();
    }
}
