import pytest as pt
from pathlib import Path
import sys
import os

# getting the name of the directory
# where the this file is present.
current = os.path.dirname(os.path.realpath(__file__))

# Getting the parent directory name
# where the current directory is present.
parent = os.path.dirname(current)

# adding the parent directory to
# the sys.path.
sys.path.append(parent)

# now we can import the module in the parent
# directory.

from services import PrepareReleaseService, TagAndPushReleaseService
from infrastructure import VersionRepository, ReleaseRepository, ReleaseTypeRepository
from infrastructure_api import GitApi

def change_test_dir( tmp_path: Path, monkeypatch: pt.MonkeyPatch):
    monkeypatch.chdir(tmp_path)

def test_prepare_release_service(tmp_path: Path, monkeypatch: pt.MonkeyPatch): # todo: maybe use mocks for service api tests
    # init
    file_name = 'config.json'
    with open(f'test/resources/{file_name}', 'r') as json_file:
        contents = json_file.read()
    f = tmp_path / file_name
    f.write_text(contents)
    change_test_dir(tmp_path, monkeypatch) # change the context of the script execution to tmp_path

    git_api = GitApi()
    git_api.init()
    git_api.add_file(file_name)
    git_api.commit("MINOR release")

    repo = ReleaseRepository(VersionRepository(f), ReleaseTypeRepository(GitApi()), 'main')
    prepare_release_service = PrepareReleaseService(repo)
    prepare_release_service.main_branch = "main"
    prepare_release_service.write_and_commit_release()

    latest_commit = git_api.get_latest_commit()

    assert '"Release v123.124.0 "\n' in latest_commit

    prepare_release_service.write_and_commit_bump()
    latest_commit = git_api.get_latest_commit()

    assert '"Version bump "\n' in latest_commit

def test_tag_and_push_release_service(tmp_path: Path, monkeypatch: pt.MonkeyPatch):
    # init
    file_name = 'config.json'
    with open(f'test/resources/{file_name}', 'r') as json_file:
        contents = json_file.read()
    f = tmp_path / file_name
    f.write_text(contents)
    change_test_dir(tmp_path, monkeypatch) # change the context of the script execution to tmp_path

    git_api = GitApi()
    git_api.init()
    git_api.add_file(file_name)
    git_api.commit("MINOR release")

    repo = ReleaseRepository(VersionRepository(f), ReleaseTypeRepository(GitApi()), 'main')

    prepare_release_service = PrepareReleaseService(repo)
    prepare_release_service.main_branch = "main"
    prepare_release_service.write_and_commit_release()

    tag_and_push_release_service = TagAndPushReleaseService(git_api)
    tag_and_push_release_service.tag_release(repo.get_release())

    assert 'v123.124.0\n' in git_api.get_latest_tag()