"""
Windows Meta File
"""
from construct import *


wmf_record = Struct(
    "records",
    ULInt32("size"),  # size in words, including the size, function and params
    Enum(ULInt16("function"),
         AbortDoc=0x0052,
         Aldus_Header=0x0001,
         AnimatePalette=0x0436,
         Arc=0x0817,
         BitBlt=0x0922,
         Chord=0x0830,
         CLP_Header16=0x0002,
         CLP_Header32=0x0003,
         CreateBitmap=0x06FE,
         CreateBitmapIndirect=0x02FD,
         CreateBrush=0x00F8,
         CreateBrushIndirect=0x02FC,
         CreateFontIndirect=0x02FB,
         CreatePalette=0x00F7,
         CreatePatternBrush=0x01F9,
         CreatePenIndirect=0x02FA,
         CreateRegion=0x06FF,
         DeleteObject=0x01F0,
         DibBitblt=0x0940,
         DibCreatePatternBrush=0x0142,
         DibStretchBlt=0x0B41,
         DrawText=0x062F,
         Ellipse=0x0418,
         EndDoc=0x005E,
         EndPage=0x0050,
         EOF=0x0000,
         Escape=0x0626,
         ExcludeClipRect=0x0415,
         ExtFloodFill=0x0548,
         ExtTextOut=0x0A32,
         FillRegion=0x0228,
         FloodFill=0x0419,
         FrameRegion=0x0429,
         Header=0x0004,
         IntersectClipRect=0x0416,
         InvertRegion=0x012A,
         LineTo=0x0213,
         MoveTo=0x0214,
         OffsetClipRgn=0x0220,
         OffsetViewportOrg=0x0211,
         OffsetWindowOrg=0x020F,
         PaintRegion=0x012B,
         PatBlt=0x061D,
         Pie=0x081A,
         Polygon=0x0324,
         Polyline=0x0325,
         PolyPolygon=0x0538,
         RealizePalette=0x0035,
         Rectangle=0x041B,
         ResetDC=0x014C,
         ResizePalette=0x0139,
         RestoreDC=0x0127,
         RoundRect=0x061C,
         SaveDC=0x001E,
         ScaleViewportExt=0x0412,
         ScaleWindowExt=0x0410,
         SelectClipRegion=0x012C,
         SelectObject=0x012D,
         SelectPalette=0x0234,
         SetBKColor=0x0201,
         SetBKMode=0x0102,
         SetDibToDev=0x0D33,
         SelLayout=0x0149,
         SetMapMode=0x0103,
         SetMapperFlags=0x0231,
         SetPalEntries=0x0037,
         SetPixel=0x041F,
         SetPolyFillMode=0x0106,
         SetReLabs=0x0105,
         SetROP2=0x0104,
         SetStretchBltMode=0x0107,
         SetTextAlign=0x012E,
         SetTextCharExtra=0x0108,
         SetTextColor=0x0209,
         SetTextJustification=0x020A,
         SetViewportExt=0x020E,
         SetViewportOrg=0x020D,
         SetWindowExt=0x020C,
         SetWindowOrg=0x020B,
         StartDoc=0x014D,
         StartPage=0x004F,
         StretchBlt=0x0B23,
         StretchDIB=0x0F43,
         TextOut=0x0521,
         _default_=Pass,
         ),
    Array(lambda ctx: ctx.size - 3, ULInt16("params")),
)

wmf_placeable_header = Struct(
    "placeable_header",
    Const(ULInt32("key"), 0x9AC6CDD7),
    ULInt16("handle"),
    SLInt16("left"),
    SLInt16("top"),
    SLInt16("right"),
    SLInt16("bottom"),
    ULInt16("units_per_inch"),
    Padding(4),
    ULInt16("checksum")
)

wmf_file = Struct(
    "wmf_file",
    # --- optional placeable header ---
    Optional(wmf_placeable_header),

    # --- header ---
    Enum(ULInt16("type"),
         InMemory=0,
         File=1,
         ),
    Const(ULInt16("header_size"), 9),
    ULInt16("version"),
    ULInt32("size"),  # file size is in words
    ULInt16("number_of_objects"),
    ULInt32("size_of_largest_record"),
    ULInt16("number_of_params"),

    # --- records ---
    GreedyRange(wmf_record)
)
