#!/usr/bin/env python3

# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0

"""Command entry_rm, similar to condor_rm, but look for a specific Factory entry

Usage:
    entry_rm entry|-l [-dir <dir>] [-printschedd] [condor_rm options]
"""

import os
import sys

from glideinwms.factory import glideFactoryConfig

STARTUP_DIR = sys.path[0]

sys.path.append(os.path.join(STARTUP_DIR, "../../../"))


USAGE = "Usage: entry_rm entry|-l [-dir <dir>] [-printschedd] [condor_rm options]"


def print_entries(entries, want_schedd):
    """Print available entries.

    This function prints the list of available entries. If the `want_schedd` flag
    is True, it prints each entry along with its corresponding schedd name.

    Args:
        entries (str): A comma-separated string of entry names.
        want_schedd (bool): If True, prints the schedd name along with each entry.
    """
    print("Available entries:")
    for entry in entries.split(","):
        if not want_schedd:
            print("  %s" % entry)
        else:
            jobDescript = glideFactoryConfig.JobDescript(entry)
            schedd_name = jobDescript.data["Schedd"]
            print("  %-40s %-30s" % (entry, schedd_name))


def main(argv):
    """Main entry point for the entry_rm utility.

    This function parses the command-line arguments, changes to the specified factory
    directory, and then executes a condor_rm command with constraints specific to the
    given entry. If the "-l" option is provided as the entry argument, it prints a list
    of available entries.

    Args:
        argv (list): List of command-line arguments.

    Raises:
        SystemExit: If required arguments are missing or the specified directory is invalid.
    """
    if len(argv) < 2:
        print(USAGE)
        sys.exit(1)

    entry = argv[1]

    # Try GLIDEIN_FACTORY_DIR env var first
    if "GLIDEIN_FACTORY_DIR" in os.environ:
        gfactory_dir = os.environ["GLIDEIN_FACTORY_DIR"]
    # is it an rpm install?
    elif os.path.isdir("/var/lib/gwms-factory/work-dir"):
        gfactory_dir = "/var/lib/gwms-factory/work-dir"
    else:
        gfactory_dir = "."

    want_schedd = False

    # parse arguments
    alen = len(argv)
    i = 2
    while i < alen:
        ael = argv[i]
        if ael == "-dir":
            i = i + 1
            gfactory_dir = argv[i]
            i = i + 1
        elif ael == "-printschedd":
            i = i + 1
            want_schedd = True
        else:
            break  # got everything

    curdir = os.getcwd()
    try:
        os.chdir(gfactory_dir)  # factoryConfig assumes the right dir
    except OSError as e:
        print(f"Dir '{gfactory_dir}' not a valid factory dir: {e}")
        sys.exit(1)

    try:
        glideinDescript = glideFactoryConfig.GlideinDescript()
    except OSError as e:
        print(f"Dir '{gfactory_dir}' not a valid factory dir: {e}")
        sys.exit(1)

    if entry == "-l":
        print_entries(glideinDescript.data["Entries"], want_schedd)
        sys.exit(0)

    jobDescript = glideFactoryConfig.JobDescript(entry)
    os.chdir(curdir)

    factory_name = glideinDescript.data["FactoryName"]
    glidein_name = glideinDescript.data["GlideinName"]
    schedd_name = jobDescript.data["Schedd"]
    const_str = '(GlideinFactory=?="{}")&&(GlideinName=?="{}")&&(GlideinEntryName=?="{}")'.format(
        factory_name,
        glidein_name,
        entry,
    )

    cr_argv = argv[i:]
    # print cr_argv

    i = 0
    while i < len(cr_argv):
        qel = cr_argv[i]
        if qel[:3] == "-co":
            const_str = f"({const_str})&&({cr_argv[i + 1]})"
            del cr_argv[i]
            del cr_argv[i]
        else:
            i = i + 1  # not an interesting one

    if want_schedd:
        print("Schedd: %s" % schedd_name)
        print("Constraint: '%s'" % const_str)

    # must flush out before forking, or any buffered content will be lost
    sys.__stdout__.flush()
    sys.__stderr__.flush()
    os.execvp("condor_rm", ["condor_rm", "-name", schedd_name, "-const", const_str] + cr_argv)


if __name__ == "__main__":
    main(sys.argv)
