import pytest

from e2b.exceptions import GitUpstreamException


@pytest.mark.skip_debug()
def test_push_updates_remote(git_sandbox, git_repo_with_commit, git_daemon):
    repo_path = git_repo_with_commit
    remote_url = git_daemon["remote_url"]

    git_sandbox.git.remote_add(repo_path, "origin", remote_url)
    git_sandbox.git.push(
        repo_path,
        remote="origin",
        branch="main",
        set_upstream=True,
    )

    message = git_sandbox.commands.run(
        f'git --git-dir="{git_daemon["remote_path"]}" log -1 --pretty=%B'
    ).stdout.strip()
    assert message == "Initial commit"


@pytest.mark.skip_debug()
def test_push_without_upstream_warns(git_sandbox, git_repo_with_commit, git_daemon):
    repo_path = git_repo_with_commit
    remote_url = git_daemon["remote_url"]

    git_sandbox.git.remote_add(repo_path, "origin", remote_url)

    with pytest.raises(GitUpstreamException) as exc:
        git_sandbox.git.push(repo_path, set_upstream=False)

    assert "no upstream branch is configured" in str(exc.value).lower()


@pytest.mark.skip_debug()
def test_pull_updates_clone(
    git_sandbox, git_repo_with_commit, git_daemon, git_base_dir, git_author
):
    repo_path = git_repo_with_commit
    remote_url = git_daemon["remote_url"]
    clone_path = f"{git_base_dir}/clone"

    git_sandbox.git.remote_add(repo_path, "origin", remote_url)
    git_sandbox.git.push(
        repo_path,
        remote="origin",
        branch="main",
        set_upstream=True,
    )
    git_sandbox.git.clone(remote_url, clone_path)

    git_sandbox.files.write(f"{repo_path}/README.md", "hello\nmore\n")
    author_name, author_email = git_author
    git_sandbox.git.add(repo_path, all=True)
    git_sandbox.git.commit(
        repo_path,
        message="Update README",
        author_name=author_name,
        author_email=author_email,
    )
    git_sandbox.git.push(repo_path)

    git_sandbox.git.pull(clone_path)
    contents = git_sandbox.files.read(f"{clone_path}/README.md")
    assert "more" in contents


@pytest.mark.skip_debug()
def test_pull_without_upstream_warns(git_sandbox, git_repo_with_commit, git_daemon):
    repo_path = git_repo_with_commit
    remote_url = git_daemon["remote_url"]

    git_sandbox.git.remote_add(repo_path, "origin", remote_url)

    with pytest.raises(GitUpstreamException) as exc:
        git_sandbox.git.pull(repo_path)

    assert "no upstream branch is configured" in str(exc.value).lower()
