use std::fmt;
use async_trait::async_trait;
use chrono::{DateTime, Utc};
use mockall::automock;
use crate::user_service::AuthUser;
#[automock]
#[async_trait]
pub trait AuthRepository<TAuthUser: AuthUser + fmt::Debug + Send + Sync> {
async fn add_user(&self, user: &TAuthUser) -> Result<i32, String>;
async fn update_user(&self, user: &TAuthUser) -> Result<(), String>;
async fn get_user(&self, id: i32) -> Result<Option<TAuthUser>, String>;
async fn get_user_by_username(&self, username: &str) -> Result<Option<TAuthUser>, String>;
async fn update_user_refresh_token(&self, user_id: i32, token_hash: &str, time_updated: DateTime<Utc>) -> Result<(), String>;
async fn get_user_refresh_token(&self, user_id: i32) -> Result<Option<String>, String>;
}