#!/usr/bin/env python3

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

"""Entry Queue (entry_q) Utility

This script is similar to condor_q but is designed to look for jobs related to a specific entry.
It allows listing available entries or executing a condor_q command with constraints specific to a
glidein Factory entry.

Usage:
    entry_q entry|-l [-dir <dir>] [-printschedd] [condor_q 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_q entry|-l [-dir <dir>] [-printschedd] [condor_q options]"


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

    If `want_schedd` is True, also prints the schedd name associated with each entry.

    Args:
        entries (str): A comma-separated string of entry names.
        want_schedd (bool): Flag indicating whether to print the schedd names.
    """
    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_q utility.

    Parses command-line arguments, changes to the specified factory directory,
    and executes a condor_q command with constraints based on the provided entry.

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

    Raises:
        SystemExit: If the usage is incorrect or the factory 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,
    )

    cq_argv = argv[i:]
    # print cq_argv

    i = 0
    while i < len(cq_argv):
        qel = cq_argv[i]
        if qel[:3] == "-co":
            const_str = f"({const_str})&&({cq_argv[i + 1]})"
            del cq_argv[i]
            del cq_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_q", ["condor_q", "-name", schedd_name, "-const", const_str] + cq_argv)


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