# Created: 08.04.2018
# Copyright (c) 2018, Manfred Moitzi
# License: MIT-License
from .graphics import ExtendedTags, DXFAttr, DefSubclass, DXFAttributes, XType
from .graphics import none_subclass, entity_subclass, ModernGraphicEntity

from typing import TYPE_CHECKING, Iterable
if TYPE_CHECKING:
    from ezdxf.eztypes import Tags, Vertex

# example: D:\source\dxftest\CADKitSamples\AEC Plan Elev Sample.dxf

_LEADER_TPL = """0
LEADER
5
0
330
0
100
AcDbEntity
8
0
100
AcDbLeader
3
DIMSTYLE
73
3
40
1.0
41
1.0
76
3
10
0.0
20
0.0
30
0.0
340
0
210
0.0
220
0.0
230
1.0
213
0.0
223
0.0
233
0.0
"""

leader_subclass = DefSubclass('AcDbLeader', {
    'dimstyle': DXFAttr(3),  # Dimension style name
    'has_arrowhead': DXFAttr(71),  # Arrowhead flag: 0/1 = no/yes
    'path_type': DXFAttr(72),  # Leader path type: 0 = Straight line segments; 1 = Spline
    'annotation_type': DXFAttr(73, default=3),  # Leader creation flag:
    # 0= Created with text annotation
    # 1 = Created with tolerance annotation;
    # 2 = Created with block reference annotation
    # 3 = Created without any annotation
    'hookline_direction': DXFAttr(74),  # Hookline direction flag:
    # 0 = Hookline (or end of tangent for a splined leader) is the opposite direction from the horizontal vector
    # 1 = Hookline (or end of tangent for a splined leader) is the same direction as horizontal vector (see code 75)
    'has_hookline': DXFAttr(75),  # Hookline flag: 0/1 = no/yes
    'text_height': DXFAttr(40),  # Text annotation height
    'text_width': DXFAttr(41),  # Text annotation width
    'n_vertices': DXFAttr(76),  # Number of vertices in leader (ignored for OPEN)
    # 10, 20, 30 - Vertex coordinates (one entry for each vertex)
    'block_color': DXFAttr(76),  # Color to use if leader's DIMCLRD = BYBLOCK
    'annotation': DXFAttr(340),  # Hard reference to associated annotation (mtext, tolerance, or insert entity)
    'normal_vector': DXFAttr(210, xtype=XType.point3d),  # Normal vector
    'horizontal_direction': DXFAttr(211, xtype=XType.point3d),  # 'horizontal' direction for leader
    'leader_offset_block_ref': DXFAttr(212, xtype=XType.point3d),  # Offset of last leader vertex from block reference insertion point
    'leader_offset_annotation_placement': DXFAttr(213, xtype=XType.point3d),  # Offset of last leader vertex from annotation placement point
    # Xdata belonging to the application ID "ACAD" follows a leader entity if any dimension overrides have been applied
    # to this entity. See Dimension Style Overrides.
})


class Leader(ModernGraphicEntity):
    # Requires AC1015/R2000
    __slots__ = ()
    TEMPLATE = ExtendedTags.from_text(_LEADER_TPL)
    DXFATTRIBS = DXFAttributes(none_subclass, entity_subclass, leader_subclass)

    @property
    def AcDbLeader(self) -> 'Tags':
        return self.tags.subclasses[2]

    def get_vertices(self) -> Iterable['Vertex']:
        return (tag.value for tag in self.AcDbLeader if tag.code == 10)
