#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: GPL-2.0-only
#

def prserv_make_conn(d, check = False):
    import prserv.serv
    host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if _f])
    try:
        conn = None
        conn = prserv.serv.connect(host_params[0], int(host_params[1]))
        if check:
            if not conn.ping():
                raise Exception('service not available')
    except Exception as exc:
        bb.fatal("Connecting to PR service %s:%s failed: %s" % (host_params[0], host_params[1], str(exc)))

    return conn

def prserv_dump_db(d):
    if not d.getVar('PRSERV_HOST'):
        bb.error("Not using network based PR service")
        return None

    conn = prserv_make_conn(d)
    if conn is None:
        bb.error("Making connection failed to remote PR service")
        return None

    #dump db
    opt_version = d.getVar('PRSERV_DUMPOPT_VERSION')
    opt_pkgarch = d.getVar('PRSERV_DUMPOPT_PKGARCH')
    opt_checksum = d.getVar('PRSERV_DUMPOPT_CHECKSUM')
    opt_col = ("1" == d.getVar('PRSERV_DUMPOPT_COL'))
    d = conn.export(opt_version, opt_pkgarch, opt_checksum, opt_col)
    conn.close()
    return d

def prserv_import_db(d, filter_version=None, filter_pkgarch=None, filter_checksum=None):
    if not d.getVar('PRSERV_HOST'):
        bb.error("Not using network based PR service")
        return None

    conn = prserv_make_conn(d)
    if conn is None:
        bb.error("Making connection failed to remote PR service")
        return None
    #get the entry values
    imported = []
    prefix = "PRAUTO$"
    for v in d.keys():
        if v.startswith(prefix):
            (remain, sep, checksum) = v.rpartition('$')
            (remain, sep, pkgarch) = remain.rpartition('$')
            (remain, sep, version) = remain.rpartition('$')
            if (remain + '$' != prefix) or \
               (filter_version and filter_version != version) or \
               (filter_pkgarch and filter_pkgarch != pkgarch) or \
               (filter_checksum and filter_checksum != checksum):
               continue
            try:
                value = int(d.getVar(remain + '$' + version + '$' + pkgarch + '$' + checksum))
            except BaseException as exc:
                bb.debug("Not valid value of %s:%s" % (v,str(exc)))
                continue
            ret = conn.importone(version,pkgarch,checksum,value)
            if ret != value:
                bb.error("importing(%s,%s,%s,%d) failed. DB may have larger value %d" % (version,pkgarch,checksum,value,ret))
            else:
               imported.append((version,pkgarch,checksum,value))
    conn.close()
    return imported

def prserv_export_tofile(d, metainfo, datainfo, lockdown, nomax=False):
    import bb.utils
    #initilize the output file
    bb.utils.mkdirhier(d.getVar('PRSERV_DUMPDIR'))
    df = d.getVar('PRSERV_DUMPFILE')
    #write data
    lf = bb.utils.lockfile("%s.lock" % df)
    with open(df, "a") as f:
        if metainfo:
            #dump column info
            f.write("#PR_core_ver = \"%s\"\n\n" % metainfo['core_ver']);
            f.write("#Table: %s\n" % metainfo['tbl_name'])
            f.write("#Columns:\n")
            f.write("#name      \t type    \t notn    \t dflt    \t pk\n")
            f.write("#----------\t --------\t --------\t --------\t ----\n")
            for i in range(len(metainfo['col_info'])):
                f.write("#%10s\t %8s\t %8s\t %8s\t %4s\n" %
                        (metainfo['col_info'][i]['name'],
                         metainfo['col_info'][i]['type'],
                         metainfo['col_info'][i]['notnull'],
                         metainfo['col_info'][i]['dflt_value'],
                         metainfo['col_info'][i]['pk']))
            f.write("\n")

        if lockdown:
            f.write("PRSERV_LOCKDOWN = \"1\"\n\n")

        if datainfo:
            idx = {}
            for i in range(len(datainfo)):
                pkgarch = datainfo[i]['pkgarch']
                value = datainfo[i]['value']
                if pkgarch not in idx:
                    idx[pkgarch] = i
                elif value > datainfo[idx[pkgarch]]['value']:
                    idx[pkgarch] = i
                f.write("PRAUTO$%s$%s$%s = \"%s\"\n" %
                    (str(datainfo[i]['version']), pkgarch, str(datainfo[i]['checksum']), str(value)))
            if not nomax:
                for i in idx:
                    f.write("PRAUTO_%s_%s = \"%s\"\n" % (str(datainfo[idx[i]]['version']),str(datainfo[idx[i]]['pkgarch']),str(datainfo[idx[i]]['value'])))
    bb.utils.unlockfile(lf)

def prserv_check_avail(d):
    host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if _f])
    try:
        if len(host_params) != 2:
            raise TypeError
        else:
            int(host_params[1])
    except TypeError:
        bb.fatal('Undefined/incorrect PRSERV_HOST value. Format: "host:port"')
    else:
        conn = prserv_make_conn(d, True)
        conn.close()
