from __future__ import print_function
import argparse
from textwrap import dedent
from ceph_volume.exceptions import SuffixParsingError
from ceph_volume import decorators
from .activate import Activate
from typing import List, Optional


def parse_osd_id(string: str) -> str:
    osd_id = string.split('-', 1)[0]
    if not osd_id:
        raise SuffixParsingError('OSD id', string)
    if osd_id.isdigit():
        return osd_id
    raise SuffixParsingError('OSD id', string)


def parse_osd_uuid(string: str) -> str:
    osd_id = '%s-' % parse_osd_id(string)
    # remove the id first
    osd_uuid = string.split(osd_id, 1)[-1]
    if not osd_uuid:
        raise SuffixParsingError('OSD uuid', string)
    return osd_uuid


class Trigger(object):

    help = 'systemd helper to activate an OSD'

    def __init__(self, argv: Optional[List[str]] = None) -> None:
        self.argv = argv

    @decorators.needs_root
    def main(self) -> None:
        sub_command_help = dedent("""
        ** DO NOT USE DIRECTLY **
        This tool is meant to help the systemd unit that knows about OSDs.

        Proxy OSD activation to ``ceph-volume lvm activate`` by parsing the
        input from systemd, detecting the UUID and ID associated with an OSD::

            ceph-volume lvm trigger {SYSTEMD-DATA}

        The systemd "data" is expected to be in the format of::

            {OSD ID}-{OSD UUID}

        The lvs associated with the OSD need to have been prepared previously,
        so that all needed tags and metadata exist.
        """)
        parser = argparse.ArgumentParser(
            prog='ceph-volume lvm trigger',
            formatter_class=argparse.RawDescriptionHelpFormatter,
            description=sub_command_help,
        )

        parser.add_argument(
            'systemd_data',
            metavar='SYSTEMD_DATA',
            nargs='?',
            help='Data from a systemd unit containing ID and UUID of the OSD, like asdf-lkjh-0'
        )
        if self.argv is None:
            self.argv = []
        if len(self.argv) == 0:
            print(sub_command_help)
            return
        args = parser.parse_args(self.argv)
        osd_id = parse_osd_id(args.systemd_data)
        osd_uuid = parse_osd_uuid(args.systemd_data)
        Activate(['--auto-detect-objectstore', osd_id, osd_uuid]).main()
