use crate::client::{
    rpc::{ExecutionLocationProvider, LauncherConfig, LauncherSpec, ParameterDefinitions},
    DecthingsParameterProvider,
};
use serde::Serialize;
#[derive(Debug, Clone)]
pub struct StateKeyData<'a, D: AsRef<[u8]>> {
    pub key: &'a str,
    pub data: D,
}
impl<D: AsRef<[u8]>> serde::Serialize for StateKeyData<'_, D> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_str(self.key)
    }
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase", tag = "method")]
#[serde(bound(serialize = ""))]
pub enum CreateModelInitialState<'a, D: AsRef<[u8]>> {
    Copy,
    #[serde(rename_all = "camelCase")]
    Create {
        name: &'a str,
        params: Vec<DecthingsParameterProvider<'a>>,
        launcher_spec: &'a LauncherSpec,
    },
    #[serde(rename_all = "camelCase")]
    Upload {
        name: &'a str,
        #[serde(rename = "stateKeyNames")]
        data: &'a [StateKeyData<'a, D>],
    },
}
impl<'a> CreateModelInitialState<'a, &'static [u8]> {
    pub fn copy() -> Self {
        Self::Copy
    }
}
impl<'a> CreateModelInitialState<'a, &'static [u8]> {
    pub fn create(
        name: &'a str,
        params: Vec<DecthingsParameterProvider<'a>>,
        launcher_spec: &'a LauncherSpec,
    ) -> Self {
        Self::Create {
            name,
            params,
            launcher_spec,
        }
    }
}
impl<'a, D: AsRef<[u8]>> CreateModelInitialState<'a, D> {
    pub fn upload(name: &'a str, data: &'a [StateKeyData<'a, D>]) -> Self {
        Self::Upload { name, data }
    }
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase", tag = "type")]
#[serde(bound(serialize = ""))]
pub enum CreateModelOptions<'a, D: AsRef<[u8]>> {
    #[serde(rename_all = "camelCase")]
    Code {
        tags: Option<&'a [super::super::TagProvider<'a>]>,
        #[serde(skip_serializing_if = "Option::is_none")]
        parameter_definitions: Option<ParameterDefinitions>,
        language: super::response::Language,
        #[serde(skip_serializing_if = "Option::is_none")]
        preset: Option<&'a str>,
        #[serde(skip_serializing_if = "Option::is_none")]
        wasm: Option<bool>,
    },
    #[serde(rename_all = "camelCase")]
    Upload {
        tags: Option<&'a [super::super::TagProvider<'a>]>,
        #[serde(skip_serializing_if = "Option::is_none")]
        parameter_definitions: Option<ParameterDefinitions>,
        format: &'a str,
        #[serde(skip_serializing)]
        data: &'a [u8],
    },
    #[serde(rename_all = "camelCase")]
    BasedOnModelSnapshot {
        model_id: &'a str,
        snapshot_id: &'a str,
        initial_state: CreateModelInitialState<'a, D>,
    },
    #[serde(rename_all = "camelCase")]
    FromExisting {
        model_id: &'a str,
        #[serde(skip_serializing_if = "Option::is_none")]
        snapshot_id: Option<&'a str>,
    },
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
#[serde(bound(serialize = ""))]
pub struct CreateModelParams<'a, D: AsRef<[u8]>> {
    pub name: &'a str,
    pub description: &'a str,
    pub options: CreateModelOptions<'a, D>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WaitForModelToBeCreatedParams<'a> {
    pub model_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteModelParams<'a> {
    pub model_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SnapshotModelParams<'a> {
    pub model_id: &'a str,
    pub snapshot_name: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateSnapshotProperties<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<&'a str>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateSnapshotParams<'a> {
    pub model_id: &'a str,
    pub snapshot_id: &'a str,
    pub properties: UpdateSnapshotProperties<'a>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteSnapshotParams<'a> {
    pub model_id: &'a str,
    pub snapshot_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OptionalDefaultLauncherSpecs<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub create_state: Option<&'a LauncherSpec>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub evaluate: Option<&'a LauncherSpec>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateModelProperties<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tags: Option<&'a [super::super::TagProvider<'a>]>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub parameter_definitions: Option<ParameterDefinitions>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_launcher_specs: Option<OptionalDefaultLauncherSpecs<'a>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_durations_seconds: Option<super::response::MaxDurationsSeconds>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub launcher_config: Option<&'a LauncherConfig>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateModelParams<'a> {
    pub model_id: &'a str,
    pub properties: UpdateModelProperties<'a>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetModelsParams<'a, S: AsRef<str>> {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(serialize_with = "super::super::serialize_option_asref_str_seq")]
    pub model_ids: Option<&'a [S]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetFilesystemSizeParams<'a> {
    pub model_id: &'a str,
    pub new_filesystem_size_mebibytes: u32,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetFilesystemUsageParams<'a> {
    pub model_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateStateMountModel<'a> {
    pub model_id: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub state_id: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub snapshot_id: Option<&'a str>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateStateParams<'a> {
    pub model_id: &'a str,
    pub name: &'a str,
    pub params: Vec<DecthingsParameterProvider<'a>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mount_models: Option<&'a [CreateStateMountModel<'a>]>,
    pub execution_location: ExecutionLocationProvider<'a>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MountModel<'a> {
    pub model_id: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub snapshot_id: Option<&'a str>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UploadStateParams<'a, S: AsRef<str>, D: AsRef<[u8]>> {
    pub model_id: &'a str,
    pub name: &'a str,
    #[serde(skip_serializing)]
    pub data: &'a [StateKeyData<'a, D>],
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(serialize_with = "super::super::serialize_option_asref_str_seq")]
    pub delete_states: Option<&'a [S]>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mount_models: Option<&'a [MountModel<'a>]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelCreateStateParams<'a> {
    pub model_id: &'a str,
    pub state_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetCreatingStatesParams<'a> {
    pub model_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WaitForStateToBeCreatedParams<'a> {
    pub model_id: &'a str,
    pub state_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateModelStateProperties<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<&'a str>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateModelStateParams<'a> {
    pub model_id: &'a str,
    pub state_id: &'a str,
    pub properties: UpdateModelStateProperties<'a>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetActiveModelStateParams<'a> {
    pub model_id: &'a str,
    pub state_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteModelStateParams<'a> {
    pub model_id: &'a str,
    pub state_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetModelStateParams<'a, S: AsRef<str>> {
    pub model_id: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub state_id: Option<&'a str>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(serialize_with = "super::super::serialize_option_asref_str_seq")]
    pub keys: Option<&'a [S]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetSnapshotStateParams<'a, S: AsRef<str>> {
    pub model_id: &'a str,
    pub snapshot_id: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(serialize_with = "super::super::serialize_option_asref_str_seq")]
    pub keys: Option<&'a [S]>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TrainParams<'a> {
    pub model_id: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub state_id: Option<&'a str>,
    pub new_state_name: &'a str,
    pub params: Vec<DecthingsParameterProvider<'a>>,
    pub execution_location: ExecutionLocationProvider<'a>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetTrainingStatusParams<'a> {
    pub model_id: &'a str,
    pub training_session_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TrainingMetricsToFetch<'a> {
    pub name: &'a str,
    pub start_index: u32,
    pub amount: u32,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetTrainingMetricsParams<'a> {
    pub model_id: &'a str,
    pub training_session_id: &'a str,
    pub metrics: &'a [TrainingMetricsToFetch<'a>],
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetTrainingSysinfoParams<'a> {
    pub model_id: &'a str,
    pub training_session_id: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub from_timestamp: Option<i64>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelTrainingSessionParams<'a> {
    pub model_id: &'a str,
    pub training_session_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ClearPreviousTrainingSessionParams<'a> {
    pub model_id: &'a str,
    pub training_session_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct EvaluateParams<'a> {
    pub model_id: &'a str,
    pub params: Vec<DecthingsParameterProvider<'a>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub snapshot_id: Option<&'a str>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetEvaluationsParams<'a> {
    pub model_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetFinishedEvaluationResultParams<'a> {
    pub model_id: &'a str,
    pub evaluation_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelEvaluationParams<'a> {
    pub model_id: &'a str,
    pub evaluation_id: &'a str,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PersistentLauncherToUse<'a> {
    pub persistent_launcher_id: &'a str,
    pub level: super::response::UsedPersistentLauncherLevel,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetUsedPersistentLaunchersForEvaluateParams<'a> {
    pub model_id: &'a str,
    pub persistent_launchers: &'a [PersistentLauncherToUse<'a>],
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetUsedPersistentLaunchersForEvaluateParams<'a> {
    pub model_id: &'a str,
}