"""
Drawing separate map elements.
"""
import argparse
import logging
from pathlib import Path

import numpy as np
import svgwrite
from svgwrite.path import Path as SVGPath

from map_machine.map_configuration import LabelMode
from map_machine.pictogram.icon import ShapeExtractor
from map_machine.pictogram.point import Point
from map_machine.scheme import LineStyle, Scheme
from map_machine.text import Label
from map_machine.workspace import workspace

__author__ = "Sergey Vartanov"
__email__ = "me@enzet.ru"


def draw_element(options: argparse.Namespace) -> None:
    """Draw single node, line, or area."""
    target: str
    tags_description: str
    if options.node:
        target = "node"
        tags_description = options.node
    elif options.way:
        target = "way"
        tags_description = options.way
    else:
        target = "area"
        tags_description = options.area

    tags: dict[str, str] = {
        tag.split("=")[0]: tag.split("=")[1]
        for tag in tags_description.split(",")
    }
    scheme: Scheme = Scheme(workspace.DEFAULT_SCHEME_PATH)
    extractor: ShapeExtractor = ShapeExtractor(
        workspace.ICONS_PATH, workspace.ICONS_CONFIG_PATH
    )
    processed: set[str] = set()
    icon, _ = scheme.get_icon(extractor, tags, processed)
    is_for_node: bool = target == "node"
    labels: list[Label] = scheme.construct_text(tags, processed, LabelMode.ALL)
    point: Point = Point(
        icon,
        labels,
        tags,
        processed,
        np.array((32.0, 32.0)),
        is_for_node=is_for_node,
        draw_outline=is_for_node,
    )
    border: np.ndarray = np.array((16.0, 16.0))
    size: np.ndarray = point.get_size() + border
    point.point = np.array((size[0] / 2.0, 16.0 / 2.0 + border[1] / 2.0))

    output_file_path: Path = workspace.output_path / "element.svg"
    svg: svgwrite.Drawing = svgwrite.Drawing(
        str(output_file_path), size.astype(float)
    )
    for style in scheme.get_style(tags):
        style: LineStyle
        path: SVGPath = svg.path(d="M 0,0 L 64,0 L 64,64 L 0,64 L 0,0 Z")
        path.update(style.style)
        svg.add(path)
    point.draw_main_shapes(svg)
    point.draw_extra_shapes(svg)
    point.draw_texts(svg)
    with output_file_path.open("w+", encoding="utf-8") as output_file:
        svg.write(output_file)
    logging.info(f"Element is written to {output_file_path}.")