use axum::{
    Json,
    extract::{Path, State},
};
use serde::Deserialize;
use serde_json::{Value, json};

use crate::{error::ApiError, service::AuthProfilePayload, state::AppState};

#[derive(Deserialize)]
pub struct WorkspacePath {
    pub workspace_id: String,
}

#[derive(Deserialize)]
pub struct WorkspaceAuthProfilePath {
    pub workspace_id: String,
    pub auth_profile_id: String,
}

pub async fn list_auth_profiles(
    Path(path): Path<WorkspacePath>,
    State(state): State<AppState>,
) -> Result<Json<Value>, ApiError> {
    let items = state
        .service
        .list_auth_profiles(&path.workspace_id.as_str().into())
        .await?;
    Ok(Json(json!({ "items": items })))
}

pub async fn create_auth_profile(
    Path(path): Path<WorkspacePath>,
    State(state): State<AppState>,
    Json(payload): Json<AuthProfilePayload>,
) -> Result<Json<Value>, ApiError> {
    let profile = state
        .service
        .create_auth_profile(&path.workspace_id.as_str().into(), payload)
        .await?;
    Ok(Json(json!(profile)))
}

pub async fn get_auth_profile(
    Path(path): Path<WorkspaceAuthProfilePath>,
    State(state): State<AppState>,
) -> Result<Json<Value>, ApiError> {
    let profile = state
        .service
        .get_auth_profile(
            &path.workspace_id.as_str().into(),
            &path.auth_profile_id.as_str().into(),
        )
        .await?;
    Ok(Json(json!(profile)))
}
