Pith - kiln
package com.vgmlr.kiln

import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import java.time.LocalDate
import java.util.concurrent.TimeUnit
import androidx.work.ExistingWorkPolicy
import androidx.work.OneTimeWorkRequestBuilder

class KilnIconSyncWorker(context: Context, params: WorkerParameters) :
    CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        val db = KilnDb.get(applicationContext)
        val account = KilnIconSync.iconAccount(
            db.accountDao().getAll(),
            KilnPrefs.get(applicationContext).defaultAccountId.value
        ) ?: run {
            KilnIconSync.apply(applicationContext, KilnIconSync.DEFAULT_BUCKET)
            return Result.success()
        }
        val records = db.dayRecordDao().getAll(account.id)
        val buttons = KilnButtonSet(db.buttonDao().getAll(account.id))
        KilnIconSync.apply(
            applicationContext,
            KilnGradientPalette.bucketToday(records, buttons, LocalDate.now())
        )
        return Result.success()
    }

    companion object {
        private const val WORK_NAME = "icon_sync"
        private const val ONCE_NAME = "icon_sync_once"

        fun schedule(context: Context) {
            WorkManager.getInstance(context).enqueueUniquePeriodicWork(
                WORK_NAME,
                ExistingPeriodicWorkPolicy.KEEP,
                PeriodicWorkRequestBuilder<KilnIconSyncWorker>(6, TimeUnit.HOURS).build()
            )
        }
        fun runOnce(context: Context) {
            WorkManager.getInstance(context).enqueueUniqueWork(
                ONCE_NAME,
                ExistingWorkPolicy.REPLACE,
                OneTimeWorkRequestBuilder<KilnIconSyncWorker>().build()
            )
        }
    }
}