// Copyright 2022 The Pigweed Authors
//
// 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
//
//     https://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.

use std::path::{Path, PathBuf};

pub mod project;

#[cfg(feature = "python")]
mod py;

pub type Result<T> = std::result::Result<T, Error>;

#[derive(thiserror::Error, Debug)]
#[non_exhaustive]
pub enum Error {
    #[error("I/O error")]
    Io(#[from] std::io::Error),

    /// Error occurred when attempting to modify a file.
    #[error("{0}: {1}")]
    File(PathBuf, std::io::Error),

    #[error("failed to serialize data: {0}")]
    Serialization(String),
}

impl Error {
    pub(crate) fn file(path: impl AsRef<Path>) -> impl FnOnce(std::io::Error) -> Self {
        move |e| Self::File(path.as_ref().to_path_buf(), e)
    }
}

impl From<toml::ser::Error> for Error {
    fn from(e: toml::ser::Error) -> Self {
        Self::Serialization(e.to_string())
    }
}

impl From<toml::de::Error> for Error {
    fn from(e: toml::de::Error) -> Self {
        Self::Serialization(e.to_string())
    }
}

#[must_use]
pub fn name() -> &'static str {
    "qg"
}

#[cfg(feature = "python")]
pub fn py_demo(code: &str) {
    use py::Py;

    let mut py = Py::new();
    let py_result = py.run(
        // Scope initialization function.
        |vm, scope| {
            // Add a `rust_print` function to the scope before running the code.
            scope.globals.set_item(
                "rust_print",
                vm.ctx
                    .new_function("rust_print", |s: String| println!("[R] {s}"))
                    .into(),
                vm,
            )?;

            Ok(())
        },
        code,
    );

    if let Err(e) = py_result {
        // Placeholder until qg has an error type
        println!("py_demo error: {e:?}");
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        assert_eq!(name(), "qg");
    }
}
