package com.bgycc.smartcanteen.data;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import androidx.annotation.NonNull;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;

import com.bgycc.smartcanteen.entity.PayData;
import com.blankj.utilcode.util.LogUtils;

import org.jetbrains.annotations.NotNull;

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

// 数据库启动时,将标记为"在线支付"的订单统一改为"离线支付"
// 避免某个在线支付订单在支付过程中App因特殊状况强制退出导致漏支付
public class ForceToPayOffline extends RoomDatabase.Callback {
    private static final String TAG = "ForceToPayOffline";
    private static final int UPDATE_MAX_TIMES = 5;
    @Override
    public void onOpen(@NonNull SupportSQLiteDatabase db) {
        Cursor cursor = db.query("select * from " + PayData.TABLE_NAME + " where payState == 0");
        if (cursor == null || cursor.getCount() <= 0) return;
        cursor.moveToFirst();
        List<PayData> list = selectPayOnlineData(cursor);
        forceToPayOffline(db, list);
    }


    @NotNull
    private static List<PayData> selectPayOnlineData(Cursor cursor) {
        List<PayData> list = new ArrayList<>();
        do {
            PayData payData = new PayData();
            payData.setEquipmentNo(cursor.getString(cursor.getColumnIndex("equipmentNo")));
            payData.setPayCode(cursor.getString(cursor.getColumnIndex("payCode")));
            payData.setTerminalType(cursor.getString(cursor.getColumnIndex("terminalType")));
            payData.setTime(cursor.getLong(cursor.getColumnIndex("time")));
            payData.setPayState(cursor.getInt(cursor.getColumnIndex("payState")));
            list.add(payData);
        } while (cursor.moveToNext());
        return list;
    }

    private static void forceToPayOffline(@NonNull SupportSQLiteDatabase db, List<PayData> list) {
        StringBuilder ids = new StringBuilder();

        db.beginTransaction();
        try {
            for (PayData payData : list) {
                payData.payOffline();
                ContentValues values = new ContentValues();
                values.put("payState", payData.getPayState());
                int r;
                int count = 0;
                do {
                    r = db.update(PayData.TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values,
                            "payCode=?", new String[]{payData.getPayCode()});
                    count++;
                    if (count == UPDATE_MAX_TIMES) {
                        LogUtils.file(TAG, "订单: " + payData.toString() + "支付状态修改异常");
                    }
                } while (r <= 0 && count < UPDATE_MAX_TIMES);

                ids.append(payData.getPayCode())
                        .append(",");
            }
            db.setTransactionSuccessful();
        } catch (Exception e) {
            LogUtils.e(TAG, "异常在线支付订单处理失败: " + e.getMessage(), e);
        }
        db.endTransaction();

        if (ids.length() > 0) {
            LogUtils.d(TAG, "由于设备异常关闭,订单号: " + ids.substring(0, ids.length() - 1) + "已强制标记为离线支付");
        }
    }
}