use crate::nats_types::UploadNewRequest;

#[allow(dead_code)]
#[derive(Debug)]
pub enum UploadError{
	Get(rbx_asset::cookie::GetError),
	Json(serde_json::Error),
	Create(rbx_asset::cookie::CreateError),
	SystemTime(std::time::SystemTimeError),
	ApiActionSubmissionUploaded(submissions_api::Error),
}
impl std::fmt::Display for UploadError{
	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
		write!(f,"{self:?}")
	}
}
impl std::error::Error for UploadError{}

pub struct Uploader{
	roblox_cookie:rbx_asset::cookie::CookieContext,
	group_id:Option<u64>,
	api:submissions_api::internal::Context,
}
impl Uploader{
	pub const fn new(
		roblox_cookie:rbx_asset::cookie::CookieContext,
		group_id:Option<u64>,
		api:submissions_api::internal::Context,
	)->Self{
		Self{
			roblox_cookie,
			group_id,
			api,
		}
	}
	pub async fn upload(&self,upload_info:UploadNewRequest)->Result<(),UploadError>{
		// download the map model version
		let model_data=self.roblox_cookie.get_asset(rbx_asset::cookie::GetAssetRequest{
			asset_id:upload_info.ModelID,
			version:Some(upload_info.ModelVersion),
		}).await.map_err(UploadError::Get)?;

		// upload the map to the strafesnet group
		let upload_response=self.roblox_cookie.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(UploadError::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,
			TargetAssetID:Some(upload_response.AssetId),
		}).await.map_err(UploadError::ApiActionSubmissionUploaded)?;

		Ok(())
	}
}