namespace GB5Shared.RecordingIntelligence;
///
/// Default DI-registered implementation. Per the plan's
/// explicit scope decision, no real LLM/STT provider is wired in this phase — every method here
/// throws a clear, specific exception instead of silently returning empty/fake data, so the
/// abstraction is real and ready but nothing pretends to work that doesn't. Callers (e.g.
/// Meeting's RecordingTranscriptBLL) must catch this exception and mark the operation as failed
/// (PROCESSINGSTATUS=4) rather than let it bubble as an unhandled 500 — see the plan's
/// "Recording capture itself is out of scope for v1" / "AI capability... explicitly deferred"
/// notes and CLAUDE.md's "never swallow exceptions" rule (this rethrows, it does not swallow).
///
/// Replace this registration with a real provider-backed implementation via DI (per-tenant if
/// needed) once a concrete AI backing is chosen — no consumer code changes required.
///
public sealed class NotConfiguredAICapabilityService : IAICapabilityService
{
private const string NotConfiguredMessage =
"AI capability not configured for this tenant/environment. Register a real " +
"IAICapabilityService implementation to enable transcription/summarization.";
public Task TranscribeAsync(byte[] audioBytes, string mimeType, CancellationToken ct)
=> throw new InvalidOperationException(NotConfiguredMessage);
public Task SummarizeAsync(string transcriptText, CancellationToken ct)
=> throw new InvalidOperationException(NotConfiguredMessage);
public Task> ExtractActionItemsAsync(string transcriptText, CancellationToken ct)
=> throw new InvalidOperationException(NotConfiguredMessage);
}