use crate::download::download_asset_version;
use crate::nats_types::UploadSubmissionRequest;

#[allow(dead_code)]
#[derive(Debug)]
pub enum Error{
	Download(crate::download::Error),
	IO(std::io::Error),
	Json(serde_json::Error),
	Create(rbx_asset::cookie::CreateError),
	SystemTime(std::time::SystemTimeError),
	ApiActionSubmissionUploaded(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_submission(&self,upload_info:UploadSubmissionRequest)->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.create(rbx_asset::cookie::CreateRequest{
			name:upload_info.ModelName.clone(),
			description:"".to_owned(),
			ispublic:false,
			allowComments:false,
			groupId:self.group_id,
		},model_data).await.map_err(Error::Create)?;

		// note the asset id of the created model for later release, and mark the submission as uploaded
		self.api.action_submission_uploaded(submissions_api::types::ActionSubmissionUploadedRequest{
			SubmissionID:upload_info.SubmissionID,
			UploadedAssetID:upload_response.AssetId,
		}).await.map_err(Error::ApiActionSubmissionUploaded)?;

		Ok(())
	}
}