from typing import Optional
from subprocess import run, CalledProcessError
import deprecation
from .domain import Devops
from .infrastructure import ProjectRepository, FileApi


@deprecation.deprecated(deprecated_in="3.2", details="create objects direct instead")
def create_devops_build_config(
    stage, project_root_path, module, build_dir_name="target"
):
    return {
        "stage": stage,
        "project_root_path": project_root_path,
        "module": module,
        "build_dir_name": build_dir_name,
    }

def get_devops_build(project):
    return project.get_property("devops_build")

class DevopsBuild:
    def __init__(self, project, config: Optional[dict] = None, devops: Optional[Devops] = None):
        self.project = project
        self.file_api = FileApi()
        self.repo = ProjectRepository()
        if not devops:
            if not config:
                raise ValueError("Build parameters could not be set!")
            devops = Devops(
                stage=config["stage"],
                project_root_path=config["project_root_path"],
                module=config["module"],
                name=project.name,
                build_dir_name=config["build_dir_name"],
            )

        self.repo.set_devops(self.project, devops)
        self.repo.set_build(self.project, self)

    def name(self):
        devops = self.repo.get_devops(self.project)
        return devops.name

    def build_path(self):
        devops = self.repo.get_devops(self.project)
        return devops.build_path()

    def initialize_build_dir(self):
        devops = self.repo.get_devops(self.project)
        self.file_api.clean_dir(devops.build_path())