package com.unibuy.smartdevice.tools;

import android.content.Context;
import android.content.SharedPreferences;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * 機台本地交易流水號生成器。
 *
 * 流水號格式：YYYYMMDDXXXX
 *   - YYYYMMDD：當日日期
 *   - XXXX：當日從 0001 起算的 4 位序號（最多 9999 筆/日，超過後循環）
 *
 * 範例：202605110001、202605110002、...
 *
 * 每天重置：當偵測到日期改變時，序號自動從 0001 重新開始。
 * 持久化：流水號存放於 SharedPreferences，App 重啟後不會遺失。
 */
public class FlowIdGenerator {

    private static final String PREFS_NAME = "FlowIdPrefs";
    private static final String KEY_LAST_DATE = "last_date";
    private static final String KEY_COUNTER = "counter";
    private static final SimpleDateFormat DATE_FORMAT =
            new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
    private static final SimpleDateFormat TIME_FORMAT =
            new SimpleDateFormat("HHmmss", Locale.getDefault());

    /**
     * 取得下一個流水號（每次呼叫自動遞增）。
     *
     * @param context Android Context
     * @return 格式為 "YYYYMMDDHHMMSSXXXX" 的流水號字串
     */
    public static synchronized String next(Context context) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        Date now = new Date();
        String today = DATE_FORMAT.format(now);
        String timePart = TIME_FORMAT.format(now);
        String lastDate = prefs.getString(KEY_LAST_DATE, "");
        int counter;

        if (!today.equals(lastDate)) {
            // 新的一天，重置計數器
            counter = 1;
        } else {
            // 同一天，遞增計數器（超過 9999 後循環回 1）
            counter = prefs.getInt(KEY_COUNTER, 0) + 1;
            if (counter > 9999) counter = 1;
        }

        // 持久化：使用 commit() 確保同步寫入磁碟，防止異常重啟導致跳號重置
        prefs.edit()
                .putString(KEY_LAST_DATE, today)
                .putInt(KEY_COUNTER, counter)
                .commit();

        // 格式化：日期 + 時分秒 + 4 位補零序號
        return today + timePart + String.format(Locale.getDefault(), "%04d", counter);
    }
}
