use tonic::{Response, Status};
use tracing::info;
use crate::server::ProtocolServer;
use crate::validation::validate_file_path;
use crate::{FileReadRequest, FileReadResponse};
pub async fn handle_file_read(
server: &ProtocolServer,
req: FileReadRequest,
) -> Result<Response<FileReadResponse>, Status> {
validate_file_path(&req.path)?;
let session = server.validate_session(&req.session_id)?;
crate::require_live_session::require_live_session(server, &req.session_id).await?;
let sid = req
.session_id
.parse::<uuid::Uuid>()
.map_err(|_| Status::invalid_argument("Invalid session ID"))?;
server.session_mgr().touch_session(&sid);
let engine = server.engine();
let ws = engine
.workspace_manager()
.get_workspace(&sid)
.ok_or_else(|| Status::not_found("Workspace not found for session"))?;
let (_repo_id, git_repo) = engine
.get_repo(&session.codebase)
.await
.map_err(|e| Status::internal(format!("Repo error: {e}")))?;
let result = ws
.read_file(&req.path, &git_repo)
.map_err(|e| Status::not_found(format!("File not found: {e}")))?;
ws.mark_read(&req.path);
info!(
session_id = %req.session_id,
path = %req.path,
modified = result.modified_in_session,
"FILE_READ: served"
);
Ok(Response::new(FileReadResponse {
content: result.content,
hash: result.hash,
modified_in_session: result.modified_in_session,
}))
}