# -*-coding: utf-8 -*-

"""Module that generates CL for cherry-picked commit."""

import subprocess
import os

from cvelib import common


class CLGeneratorException(Exception):
    """Exception class for clgenerator."""


def create_cls(bug_id, kernels):
    """Generates CLs for given kernels."""
    cl_map = {}

    for kern in kernels:
        branch = f'b{bug_id}-{kern}'
        kernel_path = os.path.join(os.getenv('CHROMIUMOS_KERNEL'), kern)

        common.do_checkout(kern, branch, kernel_path)

        # Generates CL.
        push_cmd = get_git_push_cmd(kern)
        output = do_push(push_cmd, kern, kernel_path)

        cl_map[kern] = parse_cls_output(output)

    return cl_map


def get_git_push_cmd(kernel):
    """Generates push command to chromeos branch."""
    branch = common.get_cros_branch(kernel)

    return f'git push cros HEAD:refs/for/{branch}'


def do_push(push_cmd, kernel, kernel_path):
    """Pushes to branch."""
    try:
        output = subprocess.check_output(push_cmd, stderr=subprocess.DEVNULL, cwd=kernel_path)
    except:
        raise CLGeneratorException('Push failed for %s' % kernel)

    return output


def parse_cls_output(push_msg):
    """Returns CL links from push output."""
    cl_link = []

    msg = push_msg.splitlines()

    for line in msg:
        if 'remote:   https://chromium-review' in line:
            link = line.split()[1]
            cl_link.append(link)

    return cl_link
