use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router};
use db::models::social_media_manager::{SocialMediaManagerRepository, UpsertSocialMediaManagerProfilePayload};
use contracts::{auth_middleware::AuthUser, ProfessionState};

pub fn router() -> Router<ProfessionState> {
    Router::new()
        .route("/profile/me", get(get_profile).patch(update_profile))
        .merge(contracts::profession_shared::shared_routes("SOCIAL_MEDIA_MANAGER"))
}

async fn get_profile(State(state): State<ProfessionState>, auth: AuthUser) -> impl IntoResponse {
    match SocialMediaManagerRepository::get_by_user_id(&state.pool, auth.user_id).await {
        Ok(Some(p)) => (StatusCode::OK, Json(p)).into_response(),
        Ok(None)    => (StatusCode::NOT_FOUND, "Profile not found").into_response(),
        Err(e)      => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response(),
    }
}

async fn update_profile(
    State(state): State<ProfessionState>,
    auth: AuthUser,
    Json(payload): Json<UpsertSocialMediaManagerProfilePayload>,
) -> impl IntoResponse {
    match SocialMediaManagerRepository::upsert_by_user_id(&state.pool, auth.user_id, payload).await {
        Ok(p)  => (StatusCode::OK, Json(p)).into_response(),
        Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response(),
    }
}
