// Copyright 2023 The Vello authors
// SPDX-License-Identifier: Apache-2.0 OR MIT

use naga::back::msl;

use super::{BindType, ShaderInfo};

pub fn translate(shader: &ShaderInfo) -> Result<String, msl::Error> {
    let mut map = msl::EntryPointResourceMap::default();
    let mut buffer_index = 0u8;
    let mut image_index = 0u8;
    let mut binding_map = msl::BindingMap::default();
    for resource in &shader.bindings {
        let binding = naga::ResourceBinding {
            group: resource.location.0,
            binding: resource.location.1,
        };
        let mut target = msl::BindTarget::default();
        match resource.ty {
            BindType::Buffer | BindType::BufReadOnly | BindType::Uniform => {
                target.buffer = Some(buffer_index);
                buffer_index += 1;
            }
            BindType::Image | BindType::ImageRead => {
                target.texture = Some(image_index);
                image_index += 1;
            }
        }
        target.mutable = resource.ty.is_mutable();
        binding_map.insert(binding, target);
    }
    map.insert(
        "main".to_string(),
        msl::EntryPointResources {
            resources: binding_map,
            push_constant_buffer: None,
            sizes_buffer: Some(30),
        },
    );
    let options = msl::Options {
        lang_version: (2, 0),
        per_entry_point_map: map,
        inline_samplers: vec![],
        spirv_cross_compatibility: false,
        fake_missing_bindings: false,
        bounds_check_policies: naga::proc::BoundsCheckPolicies::default(),
        zero_initialize_workgroup_memory: false,
    };
    let (source, _) = msl::write_string(
        &shader.module,
        &shader.module_info,
        &options,
        &msl::PipelineOptions::default(),
    )?;
    Ok(source)
}
