use anyhow::Result;
use deadpool_diesel::postgres::Pool;
use diesel::prelude::*;
use uuid::Uuid;

use crate::{app_error::AppError, models::Team, schema};

#[derive(Associations, Clone, Debug, Identifiable, Queryable, Selectable)]
#[diesel(table_name = schema::api_keys)]
#[diesel(belongs_to(Team))]
pub struct ApiKey {
    pub id: Uuid,
    pub team_id: Uuid,
}

impl ApiKey {
    pub async fn generate_for_team(db_pool: &Pool, team_id: Uuid) -> Result<Self, AppError> {
        let id = Uuid::new_v4();
        let api_key = db_pool
            .get()
            .await?
            .interact(move |conn| {
                diesel::insert_into(schema::api_keys::table)
                    .values((
                        schema::api_keys::id.eq(id),
                        schema::api_keys::team_id.eq(team_id),
                    ))
                    .returning(ApiKey::as_select())
                    .get_result(conn)
            })
            .await
            .unwrap()?;
        Ok(api_key)
    }
}
