#[allow(dead_code)]
#[derive(Debug)]
pub enum HandleMessageError{
	Messages(async_nats::jetstream::consumer::pull::MessagesError),
	DoubleAck(async_nats::Error),
	Json(serde_json::Error),
	UnknownSubject(String),
	CreateMapfix(submissions_api::Error),
	CreateSubmission(submissions_api::Error),
	UploadMapfix(crate::upload_mapfix::Error),
	UploadSubmission(crate::upload_submission::Error),
	ValidateMapfix(crate::validate_mapfix::Error),
	ValidateSubmission(crate::validate_submission::Error),
}
impl std::fmt::Display for HandleMessageError{
	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
		write!(f,"{self:?}")
	}
}
impl std::error::Error for HandleMessageError{}

pub type MessageResult=Result<async_nats::jetstream::Message,async_nats::jetstream::consumer::pull::MessagesError>;

fn from_slice<'a,T:serde::de::Deserialize<'a>>(slice:&'a [u8])->Result<T,HandleMessageError>{
	serde_json::from_slice(slice).map_err(HandleMessageError::Json)
}

pub struct MessageHandler{
	pub(crate) cookie_context:rbx_asset::cookie::CookieContext,
	pub(crate) group_id:Option<u64>,
	pub(crate) api:submissions_api::internal::Context,
}

impl MessageHandler{
	pub fn new(
		cookie_context:rbx_asset::cookie::CookieContext,
		group_id:Option<u64>,
		api:submissions_api::internal::Context,
	)->Self{
		Self{
			cookie_context,
			group_id,
			api,
		}
	}
	pub async fn handle_message_result(&self,message_result:MessageResult)->Result<(),HandleMessageError>{
		let message=message_result.map_err(HandleMessageError::Messages)?;
		message.double_ack().await.map_err(HandleMessageError::DoubleAck)?;
		match message.subject.as_str(){
			"maptest.mapfixes.create"=>self.create_mapfix(from_slice(&message.payload)?).await.map_err(HandleMessageError::CreateMapfix),
			"maptest.submissions.create"=>self.create_submission(from_slice(&message.payload)?).await.map_err(HandleMessageError::CreateSubmission),
			"maptest.mapfixes.upload"=>self.upload_mapfix(from_slice(&message.payload)?).await.map_err(HandleMessageError::UploadMapfix),
			"maptest.submissions.upload"=>self.upload_submission(from_slice(&message.payload)?).await.map_err(HandleMessageError::UploadSubmission),
			"maptest.mapfixes.validate"=>self.validate_mapfix(from_slice(&message.payload)?).await.map_err(HandleMessageError::ValidateMapfix),
			"maptest.submissions.validate"=>self.validate_submission(from_slice(&message.payload)?).await.map_err(HandleMessageError::ValidateSubmission),
			other=>Err(HandleMessageError::UnknownSubject(other.to_owned()))
		}
	}
}