use std::time::Duration;
use percent_encoding::{utf8_percent_encode, AsciiSet, NON_ALPHANUMERIC};
const PATH_SEGMENT: &AsciiSet = &NON_ALPHANUMERIC
.remove(b'-')
.remove(b'_')
.remove(b'.')
.remove(b'~');
pub const DEFAULT_BASE_URL: &str = "https://api.floopy.ai/v1";
pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(60);
pub const DEFAULT_MAX_RETRIES: u32 = 2;
pub(crate) const USER_AGENT_PREFIX: &str = "floopy-sdk";
pub(crate) const HEADER_CACHE_ENABLED: &str = "Floopy-Cache-Enabled";
pub(crate) const HEADER_CACHE_BUCKET_MAX_SIZE: &str = "Floopy-Cache-Bucket-Max-Size";
pub(crate) const HEADER_PROMPT_ID: &str = "Floopy-Prompt-Id";
pub(crate) const HEADER_PROMPT_VERSION: &str = "Floopy-Prompt-Version";
pub(crate) const HEADER_LLM_SECURITY_ENABLED: &str = "floopy-llm-security-enabled";
pub(crate) const HEADER_FLOOPY_PROVIDER: &str = "floopy-provider";
pub(crate) const HEADER_CONFIRM: &str = "X-Floopy-Confirm";
pub(crate) const HEADER_REQUEST_ID: &str = "X-Request-Id";
pub(crate) const HEADER_FLOOPY_SDK: &str = "X-Floopy-SDK";
pub const CONFIRM_EXPERIMENTS: &str = "experiments";
pub(crate) const ENDPOINT_FEEDBACK: &str = "/feedback";
pub(crate) const ENDPOINT_DECISIONS: &str = "/decisions";
pub(crate) const ENDPOINT_EXPERIMENTS: &str = "/experiments";
pub(crate) const ENDPOINT_CONSTRAINTS: &str = "/constraints";
pub(crate) const ENDPOINT_EXPORT_DECISIONS: &str = "/export/decisions";
pub(crate) const ENDPOINT_ROUTING_EXPLAIN: &str = "/routing/explain";
pub(crate) const ENDPOINT_EVALUATIONS: &str = "/evaluations";
pub(crate) const ENDPOINT_FILES: &str = "/files";
pub(crate) const ENDPOINT_BATCHES: &str = "/batches";
pub(crate) fn path_seg(value: &str) -> String {
utf8_percent_encode(value, PATH_SEGMENT).to_string()
}
pub(crate) fn decision_by_id(id: &str) -> String {
format!("{ENDPOINT_DECISIONS}/{}", path_seg(id))
}
pub(crate) fn session_by_id(id: &str) -> String {
format!("/session/{}", path_seg(id))
}
pub(crate) fn experiment_results(id: &str) -> String {
format!("{ENDPOINT_EXPERIMENTS}/{}/results", path_seg(id))
}
pub(crate) fn experiment_rollback(id: &str) -> String {
format!("{ENDPOINT_EXPERIMENTS}/{}/rollback", path_seg(id))
}
pub(crate) fn evaluation_by_id(id: &str) -> String {
format!("{ENDPOINT_EVALUATIONS}/{}", path_seg(id))
}
pub(crate) fn evaluation_results(id: &str) -> String {
format!("{ENDPOINT_EVALUATIONS}/{}/results", path_seg(id))
}
pub(crate) fn evaluation_cancel(id: &str) -> String {
format!("{ENDPOINT_EVALUATIONS}/{}/cancel", path_seg(id))
}
pub(crate) fn file_by_id(id: &str) -> String {
format!("{ENDPOINT_FILES}/{}", path_seg(id))
}
pub(crate) fn file_content(id: &str) -> String {
format!("{ENDPOINT_FILES}/{}/content", path_seg(id))
}
pub(crate) fn batch_by_id(id: &str) -> String {
format!("{ENDPOINT_BATCHES}/{}", path_seg(id))
}
pub(crate) fn batch_cancel(id: &str) -> String {
format!("{ENDPOINT_BATCHES}/{}/cancel", path_seg(id))
}