import pytest as pt
from pathlib import Path
from pybuilder.core import Project

from src.main.python.ddadevops.release_mixin import ReleaseMixin, create_release_mixin_config
from src.main.python.ddadevops.infrastructure.release_mixin import GitApi, EnvironmentApi
from src.main.python.ddadevops.domain import Devops, ReleaseConfig

from .helper import Helper

MAIN_BRANCH = 'main'
STAGE = 'test'
PROJECT_ROOT_PATH = '.'
MODULE = 'test'
BUILD_DIR_NAME = "build_dir"

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

class MyBuild(ReleaseMixin):
    pass

def initialize(project, CONFIG_FILE):
    project.build_depends_on('ddadevops>=3.1.2')
    config = create_release_mixin_config(CONFIG_FILE, MAIN_BRANCH)
    config.update({'stage': STAGE,
                   'module': MODULE,
                   'project_root_path': PROJECT_ROOT_PATH,
                   'build_dir_name': BUILD_DIR_NAME})
    build = MyBuild(project, config)
    return build

def initialize_with_object(project, CONFIG_FILE):
    project.build_depends_on('ddadevops>=3.1.2')
    devops = Devops(STAGE, PROJECT_ROOT_PATH, MODULE, "release_test", BUILD_DIR_NAME)
    release_config = ReleaseConfig(MAIN_BRANCH, CONFIG_FILE, devops)
    build = MyBuild(project, release_config=release_config)
    return build    

def test_release_mixin_git(tmp_path: Path, monkeypatch: pt.MonkeyPatch):

    # init
    th = Helper()
    th.copy_files(th.TEST_FILE_PATH, tmp_path)
    th.TEST_FILE_PATH = tmp_path / th.TEST_FILE_NAME

    change_test_dir(tmp_path, monkeypatch)    
    project = Project(tmp_path)

    git_api = GitApi()
    git_api.init()
    git_api.set_user_config("ex.ample@mail.com", "Ex Ample")
    git_api.add_file(th.TEST_FILE_NAME)
    git_api.commit("MAJOR release")

    build = initialize_with_object(project, th.TEST_FILE_PATH)
    build.prepare_release()
    release_version = build.prepare_release_service.release_repo.version_repository.get_version()

    # test
    assert "124.0.1-SNAPSHOT" in release_version.get_version_string()

def test_release_mixin_environment(tmp_path: Path, monkeypatch: pt.MonkeyPatch):

    # init
    th = Helper()
    th.copy_files(th.TEST_FILE_PATH, tmp_path)
    th.TEST_FILE_PATH = tmp_path / th.TEST_FILE_NAME

    change_test_dir(tmp_path, monkeypatch)    
    project = Project(tmp_path)

    git_api = GitApi()
    git_api.init()
    git_api.set_user_config("ex.ample@mail.com", "Ex Ample")
    git_api.add_file(th.TEST_FILE_NAME)
    git_api.commit("Commit Message")

    environment_api = EnvironmentApi()
    environment_api.set("DDADEVOPS_RELEASE_TYPE", "MAJOR")
   
    build = initialize(project, th.TEST_FILE_PATH)
    build.prepare_release()
    release_version = build.prepare_release_service.release_repo.version_repository.get_version()

    # test
    assert "124.0.1-SNAPSHOT" in release_version.get_version_string()

    # tear down
    environment_api.set("DDADEVOPS_RELEASE_TYPE", "")