from __future__ import print_function
import libtbx.load_env
import os
import sys
Import("env_base", "env_etc")

env_etc.xcif_dist = libtbx.env.dist_path("xcif")
env_etc.xcif_include = os.path.dirname(env_etc.xcif_dist)
env_etc.xcif_header_include = os.path.join(env_etc.xcif_dist, "include")
env_etc.xcif_common_includes = [
  env_etc.xcif_header_include,  # xcif/include/ — resolves "xcif/tokenizer.h"
  env_etc.xcif_include,         # cctbx_project/ — resolves other cctbx headers
  env_etc.libtbx_include,
]

if not libtbx.env.module_is_installed("xcif"):
  # ── Core shared library (libxcif) ─────────────────────────────────
  env_xcif_lib = env_base.Clone()
  env_etc.include_registry.prepend(
    env=env_xcif_lib,
    paths=env_etc.xcif_common_includes)
  if sys.platform == 'darwin':
    env_xcif_lib.Append(
      SHLINKFLAGS=['-install_name', '@rpath/libxcif.dylib'])
    if hasattr(env_etc, 'conda_rpath'):
      for rpath in env_etc.conda_rpath:
        env_xcif_lib.Append(SHLINKFLAGS=['-Wl,-rpath,' + rpath])

  xcif_sources = ["data_model.cpp", "tokenizer.cpp", "numeric.cpp"]

  if (env_etc.static_libraries):
    builder = env_xcif_lib.StaticLibrary
  else:
    builder = env_xcif_lib.SharedLibrary

  builder(
    target="#lib/xcif",
    source=xcif_sources)

  # ── C++ test executables (link against libxcif) ────────────────────
  env_xcif_cpp_tests = env_base.Clone()
  env_etc.include_registry.prepend(
    env=env_xcif_cpp_tests,
    paths=env_etc.xcif_common_includes)
  env_xcif_cpp_tests.Prepend(LIBS=["xcif"])
  if sys.platform == 'darwin' and hasattr(env_etc, 'conda_rpath'):
    for rpath in env_etc.conda_rpath:
      env_xcif_cpp_tests.Append(LINKFLAGS=['-Wl,-rpath,' + rpath])

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_infrastructure",
    source="regression/cpp/tst_infrastructure.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_string_view",
    source="regression/cpp/tst_string_view.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_tokenizer",
    source="regression/cpp/tst_tokenizer.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_mapped_file",
    source="regression/cpp/tst_mapped_file.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/example_tokenize",
    source="regression/cpp/example_tokenize.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_data_model",
    source="regression/cpp/tst_data_model.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_error_handling",
    source="regression/cpp/tst_error_handling.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_numeric",
    source="regression/cpp/tst_numeric.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/example_parse",
    source="regression/cpp/example_parse.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_non_strict_mode",
    source="regression/cpp/tst_non_strict_mode.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_quoted_string_delimiter",
    source="regression/cpp/tst_quoted_string_delimiter.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_semicolon_field_strict",
    source="regression/cpp/tst_semicolon_field_strict.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/tst_thread_safety",
    source="regression/cpp/tst_thread_safety.cpp")

  env_xcif_cpp_tests.Program(
    target="regression/cpp/fuzz_target",
    source="regression/cpp/fuzz_target.cpp")

  env_xcif_cpp_tests.Program(
    target="benchmarks/bench_xcif",
    source="benchmarks/bench_xcif.cpp")

  # ── Boost.Python extension (links against libxcif) ─────────────────
  if (not env_etc.no_boost_python):
    Import("env_no_includes_boost_python_ext")
    env_xcif_bpl = env_no_includes_boost_python_ext.Clone()
    env_etc.include_registry.append(
      env=env_xcif_bpl,
      paths=env_etc.xcif_common_includes + [
        env_etc.boost_adaptbx_include,
        env_etc.boost_include,
        env_etc.python_include,
        env_etc.scitbx_include,
      ])
    env_xcif_bpl.Prepend(LIBS=["xcif"])
    if sys.platform == 'darwin' and hasattr(env_etc, 'conda_rpath'):
      for rpath in env_etc.conda_rpath:
        env_xcif_bpl.Append(LINKFLAGS=['-Wl,-rpath,' + rpath])
    env_xcif_bpl.SharedLibrary(
      target="#lib/xcif_ext",
      source=["xcif_ext.cpp"])
