#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Univention Management Console Distribution Module
#
# SPDX-FileCopyrightText: 2008-2026 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only

import inspect
import os
import sys
from argparse import ArgumentParser

import univention.config_registry
import univention.debug as ud
from univention.management.console.modules.distribution import util

configRegistry = univention.config_registry.ConfigRegistry()
configRegistry.load()


def debugmsg(component, level, msg):
    info = inspect.getframeinfo(inspect.currentframe().f_back)[0:3]
    printInfo = []
    if len(info[0]) > 28:
        printInfo.append("..." + info[0][-25:])
    else:
        printInfo.append(info[0])
    printInfo.extend(info[1:3])
    ud.debug(component, level, "%s:%s: %s" % (printInfo[0], printInfo[1], msg))
    print(msg)


def main():
    exitcode = 0
    debug_level = int(configRegistry.get("umc/module/debug/level", "1"))
    debug_level = max(debug_level, 1)
    if configRegistry.get("ucsschool/datadistribution/debug/level", None):
        debug_level = int(configRegistry.get("ucsschool/datadistribution/debug/level"))

    parser = ArgumentParser()
    parser.add_argument(
        "-d",
        "--debug",
        action="store",
        type=int,
        default=debug_level,
        help="if set, debugging is activated and set to the specified level",
    )

    # parser.add_argument( '-i', '--init', action='store_true', help='init specified project')

    parser.add_argument(
        "-c",
        "--collect",
        action="store_true",
        default=False,
        help="collect specified project",
    )

    parser.add_argument(
        "-s",
        "--distribute",
        action="store_true",
        default=False,
        help="distribute specified project",
    )

    # parser.add_argument('-f', '--force', action='store_true', help='force action')

    parser.add_argument("-r", "--remove", action="store_true", help="remove project data")
    parser.add_argument("project", nargs="?")

    options = parser.parse_args()

    # open logging
    ud.init("/var/log/univention/ucs-school-umc-distribution.log", ud.FLUSH, ud.FUNCTION)
    ud.set_level(ud.ADMIN, options.debug)
    debugmsg(ud.ADMIN, ud.INFO, "umc-distribution started: args=%s" % (sys.argv,))

    if int(options.collect) + int(options.distribute) + int(options.remove) != 1:
        debugmsg(ud.ADMIN, ud.ERROR, "please specify one action: --distribute, --collect, or --remove")
        sys.exit(250)

    if options.project:
        if not os.path.exists(options.project):
            debugmsg(ud.ADMIN, ud.ERROR, "umc-distribution: file does not exist: %s" % options.project)
            exitcode = 10
        elif not os.path.isfile(options.project):
            debugmsg(ud.ADMIN, ud.ERROR, "umc-distribution: is not a file: %s" % options.project)
            exitcode = 20
        else:
            # try to load project data
            project = util.Project.load(options.project)
            if not project:
                # loading failed
                debugmsg(
                    ud.ADMIN,
                    ud.ERROR,
                    "umc-distribution finished: loading failed: %s" % (options.project),
                )
                exitcode = 30
            else:
                # project has been loaded
                if options.distribute:
                    # distribute files
                    usersFailed = []
                    project.distribute(usersFailed)
                    for iuser in usersFailed:
                        debugmsg(ud.ADMIN, ud.ERROR, "  distribution to user failed: %s" % iuser)
                    if usersFailed:
                        exitcode = 40
                    debugmsg(
                        ud.ADMIN, ud.INFO, "umc-distribution finished: distributing: args=%s" % sys.argv
                    )

                elif options.collect:
                    # collect project files
                    dirsFailed = []
                    project.collect(dirsFailed)
                    for idir in dirsFailed:
                        debugmsg(ud.ADMIN, ud.ERROR, "  collecting from user failed: %s" % idir)
                    if dirsFailed:
                        exitcode = 50
                    debugmsg(
                        ud.ADMIN, ud.INFO, "umc-distribution finished: collecting: args=%s" % sys.argv
                    )

                elif options.remove:
                    # remove project data
                    project.purge()
                    debugmsg(
                        ud.ADMIN, ud.INFO, "umc-distribution finished: removing: args=%s" % sys.argv
                    )

    debugmsg(ud.ADMIN, ud.INFO, "finished umc-distribution: args=%s" % sys.argv)
    sys.exit(exitcode)


if __name__ == "__main__":
    main()
