use pyo3::prelude::*;
mod config;
mod csp;
mod enums;
pub mod errors;
mod futoshiki_api;
mod sudoku_api;
pub use config::{CancelToken, SolveConfig, SolveStats};
pub use csp::Csp;
pub use enums::{Ordering, PropagationStrategy, Pruning};
pub use errors::{BudgetExceededError, CspTimeoutError, InvalidInputError, UnsatisfiableError};
pub use futoshiki_api::{
FutoshikiBoard, FutoshikiCSP, create_futoshiki_csp, create_random_futoshiki, solve_futoshiki,
};
pub use sudoku_api::{
SudokuCSP, SudokuDifficulty, create_random_board, create_sudoku_csp, solve_sudoku,
solve_sudoku_board, template_count,
};
#[pymodule]
pub fn csp_solver(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<Pruning>()?;
m.add_class::<Ordering>()?;
m.add_class::<PropagationStrategy>()?;
m.add_class::<SolveConfig>()?;
m.add_class::<SolveStats>()?;
m.add_class::<CancelToken>()?;
m.add_class::<Csp>()?;
m.add_class::<SudokuDifficulty>()?;
m.add_class::<SudokuCSP>()?;
m.add_function(wrap_pyfunction!(create_sudoku_csp, m)?)?;
m.add_function(wrap_pyfunction!(solve_sudoku, m)?)?;
m.add_function(wrap_pyfunction!(solve_sudoku_board, m)?)?;
m.add_function(wrap_pyfunction!(create_random_board, m)?)?;
m.add_function(wrap_pyfunction!(template_count, m)?)?;
m.add_class::<FutoshikiCSP>()?;
m.add_class::<FutoshikiBoard>()?;
m.add_function(wrap_pyfunction!(create_futoshiki_csp, m)?)?;
m.add_function(wrap_pyfunction!(solve_futoshiki, m)?)?;
m.add_function(wrap_pyfunction!(create_random_futoshiki, m)?)?;
m.add(
"UnsatisfiableError",
m.py().get_type::<UnsatisfiableError>(),
)?;
m.add(
"BudgetExceededError",
m.py().get_type::<BudgetExceededError>(),
)?;
m.add("InvalidInputError", m.py().get_type::<InvalidInputError>())?;
m.add("CspTimeoutError", m.py().get_type::<CspTimeoutError>())?;
Ok(())
}