// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! This module contains functions and structures related to xpath handling

use crate::app_state::AppState;
use crate::handlers::chassis::{append_to_urls, handle_xpath_segment};
use anyhow::Context;
use std::collections::HashMap;
use std::sync::Arc;

/// Retrieves URLs based on the provided XPath-like segments.
///
/// # Arguments
///
/// * `state` - The application state.
/// * `identifiers` - A map of identifiers and their corresponding values.
/// * `segments` - A slice of string slices representing the XPath-like segments.
///
/// # Returns
///
/// A Result containing a vector of URLs or an error.
pub async fn get_xpath_urls(
    state: &Arc<AppState>,
    identifiers: &HashMap<String, Vec<String>>,
    segments: &[&str],
) -> Result<Vec<String>, anyhow::Error> {
    let mut urls = vec![String::from("http://localhost")];
    for segment in segments {
        if segment.starts_with('{') && segment.ends_with('}') {
            // SAFETY: range access is checked
            let placeholder = &segment[1..segment.len() - 1];
            if let Some(values) = identifiers.get(placeholder) {
                if values.contains(&"*".to_string()) {
                    if values.len() != 1 {
                        return Err(anyhow::anyhow!(
                            "Wildcard must be the only value for placeholder '{}'",
                            placeholder
                        ));
                    }
                    handle_xpath_segment(&mut urls, placeholder, state)
                        .await
                        .context(format!(
                            "Failed to handle XPath segment for placeholder '{}'",
                            placeholder
                        ))?;
                    // TODO: implement filter logic based on the protobuf message format
                    // urls = filter_urls(&urls, placeholder, filters, state).await?;
                }
            }
        } else {
            append_to_urls(&mut urls, segment);
        }
    }
    Ok(urls)
}
