package com.bgycc.smartcanteen.data;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.DatabaseConfiguration;
import androidx.room.InvalidationTracker;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteOpenHelper;

import com.bgycc.smartcanteen.data.dao.CommandDao;
import com.bgycc.smartcanteen.data.dao.PayDataDao;
import com.bgycc.smartcanteen.data.dao.PayResponseDao;
import com.bgycc.smartcanteen.entity.Command;
import com.bgycc.smartcanteen.entity.PayData;
import com.bgycc.smartcanteen.entity.PayResponse;
import com.blankj.utilcode.util.Utils;

@Database(
        entities = {
                Command.class,
                PayData.class,
                PayResponse.class
        },
        version = 2,
        exportSchema = false)
public abstract class DatabaseManager extends RoomDatabase {

    @NonNull
    @Override
    protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration config) {
        return null;
    }

    @NonNull
    @Override
    protected InvalidationTracker createInvalidationTracker() {
        return null;
    }

    @Override
    public void clearAllTables() {
    }

    private static final String DB_NAME = "smart_canteen.db";

    private static volatile DatabaseManager instance;

    public static synchronized DatabaseManager getInstance() {
        if (instance == null) {
            instance = create(Utils.getApp().getApplicationContext());
        }
        return instance;
    }

    private static DatabaseManager create(final Context context) {
        return Room.databaseBuilder(
                context.getApplicationContext(),
                DatabaseManager.class,
                DB_NAME)
                .addCallback(new OldDataCompatible())
                .addCallback(new FinishCommand())
                .addCallback(new ForceToPayOffline())
                .addMigrations(new _1To_2Migration())
                // 一旦版本不兼容则清空数据库
                .fallbackToDestructiveMigration()
                .allowMainThreadQueries()
                .build();
    }

    public abstract CommandDao getCommandDao();

    public abstract PayDataDao getPayDataDao();

    public abstract PayResponseDao getPayResponseDao();
}