use async_trait::async_trait;
use modkit_db::secure::DBRunner;
use modkit_macros::domain_model;
use modkit_security::AccessScope;
use uuid::Uuid;
use crate::domain::error::DomainError;
use crate::infra::db::entity::quota_usage::{Model as QuotaUsageModel, PeriodType};
#[domain_model]
#[allow(dead_code)]
pub struct IncrementReserveParams {
pub tenant_id: Uuid,
pub user_id: Uuid,
pub period_type: PeriodType,
pub period_start: time::Date,
pub bucket: String,
pub amount_micro: i64,
}
#[domain_model]
#[allow(dead_code)]
pub struct SettleParams {
pub tenant_id: Uuid,
pub user_id: Uuid,
pub period_type: PeriodType,
pub period_start: time::Date,
pub bucket: String,
pub reserved_credits_micro: i64,
pub actual_credits_micro: i64,
pub input_tokens: Option<i64>,
pub output_tokens: Option<i64>,
pub web_search_calls: u32,
pub code_interpreter_calls: u32,
}
#[async_trait]
#[allow(dead_code)]
pub trait QuotaUsageRepository: Send + Sync {
async fn increment_reserve<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
params: IncrementReserveParams,
) -> Result<(), DomainError>;
async fn settle<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
params: SettleParams,
) -> Result<(), DomainError>;
async fn find_bucket_rows<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
tenant_id: Uuid,
user_id: Uuid,
) -> Result<Vec<QuotaUsageModel>, DomainError>;
async fn find_bucket_rows_for_update<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
tenant_id: Uuid,
user_id: Uuid,
period_types: &[PeriodType],
period_starts: &[time::Date],
) -> Result<Vec<QuotaUsageModel>, DomainError>;
async fn get_daily_web_search_calls<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
tenant_id: Uuid,
user_id: Uuid,
period_start: time::Date,
) -> Result<u32, DomainError>;
async fn get_daily_code_interpreter_calls<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
tenant_id: Uuid,
user_id: Uuid,
period_start: time::Date,
) -> Result<u32, DomainError>;
}