use crate::nats_types::CreateSubmissionRequest;
use crate::create::CreateRequest;
use crate::rbx_util::GameID;

#[allow(dead_code)]
#[derive(Debug)]
pub enum Error{
	Create(crate::create::Error),
	ApiActionSubmissionCreate(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{
	async fn create_submission_inner(&self,create_info:CreateSubmissionRequest)->Result<(),Error>{
		let create_request=self.create_inner(CreateRequest{
			ModelID:create_info.ModelID,
		}).await.map_err(Error::Create)?;

		// grab values from submission form, otherwise try to fill blanks from map data
		let display_name=if create_info.DisplayName.is_empty(){
			create_request.DisplayName.as_deref().unwrap_or_default()
		}else{
			create_info.DisplayName.as_str()
		};

		let creator=if create_info.Creator.is_empty(){
			create_request.Creator.as_deref().unwrap_or_default()
		}else{
			create_info.Creator.as_str()
		};

		let game_id=create_info.GameID.try_into().ok().or(create_request.GameID).unwrap_or(GameID::Bhop);

		// call create on api
		self.api.create_submission(submissions_api::types::CreateSubmissionRequest{
			OperationID:create_info.OperationID,
			AssetOwner:create_request.AssetOwner as i64,
			DisplayName:display_name,
			Creator:creator,
			GameID:game_id as i32,
			AssetID:create_info.ModelID,
			AssetVersion:create_request.AssetVersion,
		}).await.map_err(Error::ApiActionSubmissionCreate)?;

		Ok(())
	}
	pub async fn create_submission(&self,create_info:CreateSubmissionRequest)->Result<(),submissions_api::Error>{
		let operation_id=create_info.OperationID;

		let create_result=self.create_submission_inner(create_info).await;

		if let Err(e)=create_result{
			self.api.action_operation_failed(submissions_api::types::ActionOperationFailedRequest{
				OperationID:operation_id,
				StatusMessage:e.to_string(),
			}).await?;
		}

		Ok(())
	}
}