use crate::download::download_asset_version;
use crate::nats_types::UploadMapfixRequest;

#[allow(dead_code)]
#[derive(Debug)]
pub enum Error{
	Download(crate::download::Error),
	IO(std::io::Error),
	Json(serde_json::Error),
	Upload(rbx_asset::cookie::UploadError),
	ApiActionMapfixUploaded(submissions_api::Error),
}
impl std::fmt::Display for Error{
	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
		write!(f,"{self:?}")
	}
}
impl std::error::Error for Error{}

impl crate::message_handler::MessageHandler{
	pub async fn upload_mapfix(&self,upload_info:UploadMapfixRequest)->Result<(),Error>{
		// download the map model
		let maybe_gzip=download_asset_version(&self.cloud_context,rbx_asset::cloud::GetAssetVersionRequest{
			asset_id:upload_info.ModelID,
			version:upload_info.ModelVersion,
		}).await.map_err(Error::Download)?;

		// transparently handle gzipped models
		let model_data=maybe_gzip.to_vec().map_err(Error::IO)?;

		// upload the map to the strafesnet group
		let _upload_response=self.cookie_context.upload(rbx_asset::cookie::UploadRequest{
			assetid:upload_info.TargetAssetID,
			groupId:self.group_id,
			name:None,
			description:None,
			ispublic:None,
			allowComments:None,
		},model_data).await.map_err(Error::Upload)?;

		// that's it, the database entry does not need to be changed.

		// mark mapfix as uploaded, TargetAssetID is unchanged
		self.api.action_mapfix_uploaded(submissions_api::types::ActionMapfixUploadedRequest{
			MapfixID:upload_info.MapfixID,
		}).await.map_err(Error::ApiActionMapfixUploaded)?;

		Ok(())
	}
}