# type: ignore
# pylint: skip-file, disable-all

import glob
import os
import sys
from os.path import abspath, dirname
from os.path import join as jj
from os.path import normpath as nj
from os.path import realpath

# os.environ['CUDA_LAUNCH_BLOCKING'] = '1'


from loguru import logger as loguru_logger
from snakemake import shell
from snakemake.io import expand, glob_wildcards


PACKAGE_PATH = abspath(jj(dirname(realpath(workflow.snakefile)), ".."))

if PACKAGE_PATH not in sys.path:
    sys.path.insert(0, PACKAGE_PATH)


from workflow.config import Config, load_typed_config
from workflow.utility import path_add_date, sync_delta_names, expand_target_files, setup_logging


setup_logging()

if sys.platform not in ["win32"]:
    shell.prefix("set -o pipefail; ")

config_filename: str = (config or {}).get("config_filename", "config.yml")
typed_config: Config = load_typed_config(config_filename)

rule all:
    input:
        expand_target_files(
            typed_config.parla_clarin.folder,
            typed_config.source_extension,
            typed_config.annotated_folder,
            typed_config.target_extension,
            years=config.get("year_filter", None)
        )


include: jj("rules", "help.smk")
include: jj("rules", "update_repository.smk")
include: jj("rules", "compute_frequency.smk")
include: jj("rules", "tag_protocols.smk")
# include: jj("rules", "extract_speeches.smk")


onstart:
    loguru_logger.info("Workflow started")
    os.makedirs(typed_config.annotated_folder, exist_ok=True)
    os.makedirs(typed_config.work_folders.data_folder, exist_ok=True)
    os.makedirs(typed_config.work_folders.log_folder, exist_ok=True)
    os.makedirs(typed_config.annotated_folder, exist_ok=True)
    # os.makedirs(typed_config.extract_speeches.folder, exist_ok=True)


onsuccess:
    sync_delta_names(typed_config.parla_clarin.folder, "xml", typed_config.annotated_folder, "xml", delete=True)
    loguru_logger.info("Workflow ended")


onerror:
    loguru_logger.error("Workflow FAILED")
