// SPDX-FileCopyrightText: 2026 ahouts
//
// SPDX-License-Identifier: GPL-2.0-or-later

struct SlugRewriter {
    rules: Vec<(String, String)>,
}

fn create_rewriter(match_prefixes: &[String], replace_prefixes: &[String]) -> Box<SlugRewriter> {
    let rules: Vec<(String, String)> = match_prefixes
        .iter()
        .zip(replace_prefixes.iter())
        .map(|(m, r)| (m.clone(), r.clone()))
        .collect();

    Box::new(SlugRewriter { rules })
}

impl SlugRewriter {
    fn rewrite_url(&self, url: &str) -> ffi::RewriteResult {
        for (match_prefix, replace_prefix) in &self.rules {
            if url.starts_with(match_prefix.as_str()) {
                let rewritten = format!("{}{}", replace_prefix, &url[match_prefix.len()..]);
                return ffi::RewriteResult {
                    matched: true,
                    rewritten_url: rewritten,
                };
            }
        }

        ffi::RewriteResult {
            matched: false,
            rewritten_url: String::new(),
        }
    }
}

#[cxx::bridge]
mod ffi {
    #[derive(Default)]
    struct RewriteResult {
        matched: bool,
        #[cxx_name = "rewrittenUrl"]
        rewritten_url: String,
    }

    extern "Rust" {
        type SlugRewriter;

        #[cxx_name = "createRewriter"]
        fn create_rewriter(
            match_prefixes: &[String],
            replace_prefixes: &[String],
        ) -> Box<SlugRewriter>;

        #[cxx_name = "rewriteUrl"]
        fn rewrite_url(self: &SlugRewriter, url: &str) -> RewriteResult;
    }
}