# 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.

import tempfile
import textwrap
import unittest
from pathlib import Path

from plan import plan


def write_manifest(path: Path, content: str) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(textwrap.dedent(content).strip() + "\n", encoding="utf-8")


class ReleaseRustPlanTest(unittest.TestCase):
    def test_fixture_plan_orders_path_dependencies(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            root = Path(tmpdir)

            write_manifest(
                root / "core" / "core" / "Cargo.toml",
                """
                [package]
                name = "opendal-core"
                version = "0.1.0"
                """,
            )
            write_manifest(
                root / "core" / "layers" / "retry" / "Cargo.toml",
                """
                [package]
                name = "opendal-layer-retry"
                version = "0.1.0"

                [dependencies]
                opendal-core = { path = "../../core", version = "0.1.0" }
                """,
            )
            write_manifest(
                root / "core" / "services" / "fs" / "Cargo.toml",
                """
                [package]
                name = "opendal-service-fs"
                version = "0.1.0"

                [dependencies]
                opendal-core = { path = "../../core", version = "0.1.0" }
                """,
            )
            write_manifest(
                root / "core" / "Cargo.toml",
                """
                [package]
                name = "opendal"
                version = "0.1.0"

                [dependencies]
                opendal-core = { path = "core", version = "0.1.0" }
                opendal-layer-retry = { path = "layers/retry", version = "0.1.0" }

                [target.'cfg(unix)'.build-dependencies]
                opendal-service-fs = { path = "services/fs", version = "0.1.0" }
                """,
            )
            write_manifest(
                root / "integrations" / "object_store" / "Cargo.toml",
                """
                [package]
                name = "object_store_opendal"
                version = "0.1.0"

                [dependencies]
                opendal = { path = "../../core", version = "0.1.0" }
                """,
            )
            write_manifest(
                root / "core" / "services" / "private" / "Cargo.toml",
                """
                [package]
                name = "opendal-service-private"
                version = "0.1.0"
                publish = false
                """,
            )

            result = plan(root)
            self.assertEqual(
                result,
                [
                    "core/core",
                    "core/layers/retry",
                    "core/services/fs",
                    "core",
                    "integrations/object_store",
                ],
            )

    def test_repository_plan_excludes_non_release_paths(self):
        result = plan()

        self.assertIn("core/core", result)
        self.assertIn("core", result)
        self.assertIn("integrations/object_store", result)

        self.assertNotIn("bindings/python", result)
        self.assertNotIn("core/testkit", result)
        self.assertNotIn("core/examples/basic", result)

    def test_repository_plan_orders_core_before_root_and_integrations(self):
        result = plan()

        self.assertLess(result.index("core/core"), result.index("core"))
        self.assertLess(result.index("core"), result.index("integrations/object_store"))
        self.assertLess(result.index("core"), result.index("integrations/parquet"))
        self.assertLess(result.index("core"), result.index("integrations/unftp-sbe"))


if __name__ == "__main__":
    unittest.main()
