// Copyright 2025 The Jujutsu 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 testutils::TestResult;
use testutils::git;

use crate::common::TestEnvironment;

#[test]
fn test_git_root_git_backend_noncolocated() {
    let test_env = TestEnvironment::default();
    test_env.run_jj_in(".", ["git", "init", "repo"]).success();
    let work_dir = test_env.work_dir("repo");

    let output = work_dir.run_jj(["git", "root"]);
    insta::assert_snapshot!(output, @"
    $TEST_ENV/repo/.jj/repo/store/git
    [EOF]
    ");
}

#[test]
fn test_git_root_git_backend_colocated() {
    let test_env = TestEnvironment::default();
    test_env
        .run_jj_in(".", ["git", "init", "--colocate", "repo"])
        .success();
    let work_dir = test_env.work_dir("repo");

    let output = work_dir.run_jj(["git", "root"]);
    insta::assert_snapshot!(output, @"
    $TEST_ENV/repo/.git
    [EOF]
    ");
}

#[test]
fn test_git_root_git_backend_external_git_dir() -> TestResult {
    let test_env = TestEnvironment::default();
    let work_dir = test_env.work_dir("").create_dir("repo");
    let git_repo_work_dir = test_env.work_dir("git-repo");
    let git_repo = git::init(git_repo_work_dir.root());

    // Create an initial commit in Git
    let tree_id = git::add_commit(
        &git_repo,
        "refs/heads/master",
        "file",
        b"contents",
        "initial",
        &[],
    )
    .tree_id;
    git::checkout_tree_index(&git_repo, tree_id);
    assert_eq!(git_repo_work_dir.read_file("file"), b"contents");
    insta::assert_snapshot!(
        git_repo.head_id()?.to_string(),
        @"97358f54806c7cd005ed5ade68a779595efbae7e"
    );

    work_dir
        .run_jj([
            "git",
            "init",
            "--git-repo",
            git_repo_work_dir.root().to_str().unwrap(),
        ])
        .success();

    let output = work_dir.run_jj(["git", "root"]);
    insta::assert_snapshot!(output, @"
    $TEST_ENV/git-repo/.git
    [EOF]
    ");
    Ok(())
}

#[test]
fn test_git_root_simple_backend() {
    let test_env = TestEnvironment::default();
    test_env
        .run_jj_in(".", ["debug", "init-simple", "repo"])
        .success();
    let work_dir = test_env.work_dir("repo");

    let output = work_dir.run_jj(["git", "root"]);
    insta::assert_snapshot!(output, @"
    ------- stderr -------
    Error: The repo is not backed by a Git repo
    [EOF]
    [exit status: 1]
    ");
}
