#pragma once #include #include #include #include // Prompt: free to accept prompts. // LimitReset: computed - a Wait whose time has passed (can also be set by hand). enum class StatusKind { Prompt, LimitReset, Testing, Wait, Uploading, Frozen, Done }; struct Status { StatusKind kind = StatusKind::Prompt; std::time_t waitUntil = 0; // only meaningful when kind == Wait }; namespace StatusUtil { Status make(StatusKind kind); // User input such as "testing" or "wait 16:30". A wait time that has already // passed today is taken to mean tomorrow. std::optional parse(const std::string& text, std::time_t now); // Database representation, e.g. "testing" or "wait 2026-10-17T16:30". std::string serialize(const Status& status); std::optional deserialize(const std::string& text); // The status shown to the user: an expired wait becomes LimitReset. Status effective(const Status& status, std::time_t now); std::string label(const Status& status); // "Prompt", "Limit reset", "Wait 16:30", ... std::string kindName(StatusKind kind); // lowercase token: "prompt", "limit-reset", ... std::vector allKinds(); // Accepts "limit-reset", "limit_reset", "limitreset", "reset"; "available" is an // old name for "prompt". std::optional kindFromName(const std::string& name); int rank(StatusKind kind); // task sort priority, lowest first bool isBusy(StatusKind kind); // does this status hold the account? } // namespace StatusUtil