# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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
#
#   http://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.

"""
Build backend wrapper that resolves license symlinks before delegating
to scikit-build-core.

Arrow's LICENSE.txt and NOTICE.txt live at the repository root, one level
above python/. They are symlinked into python/ so that license-files in
pyproject.toml can reference them otherwise project metadata fails validation.
This is done before any build backend is invoked that's why symlinks are necessary.
But when building sdist tarballs symlinks are not copied and we end up with
broken LICENSE.txt and NOTICE.txt.

This custom build backend replaces the symlinks with actual file copies before
scikit_build_core.build.build_sdist so that the sdist contains the real file content.
The symlinks are restored afterwards to keep the git working tree clean.
"""

from contextlib import contextmanager
import os
from pathlib import Path
import shutil
import sys

from scikit_build_core.build import *  # noqa: F401,F403
from scikit_build_core.build import build_sdist as scikit_build_sdist

LICENSE_FILES = ("LICENSE.txt", "NOTICE.txt")
PYTHON_DIR = Path(__file__).resolve().parent.parent


@contextmanager
def prepare_licenses():
    # Temporarily copy the files so they are included on sdist.
    for name in LICENSE_FILES:
        parent_license = PYTHON_DIR.parent / name
        pyarrow_license = PYTHON_DIR / name
        pyarrow_license.unlink(missing_ok=True)
        shutil.copy2(parent_license, pyarrow_license)
    try:
        yield
    finally:
        if sys.platform != "win32":
            # Copy back the original symlinks so git status is clean.
            for name in LICENSE_FILES:
                filepath = PYTHON_DIR / name
                os.unlink(filepath)
                os.symlink(f"../{name}", filepath)


def build_sdist(sdist_directory, config_settings=None):
    with prepare_licenses():
        return scikit_build_sdist(sdist_directory, config_settings)
