from copy import deepcopy

from plyfile import PlyData

SCANNET_COLOR_MAP = {
    0: (0., 0., 0.),
    1: (174., 199., 232.),
    2: (152., 223., 138.),
    3: (31., 119., 180.),
    4: (255., 187., 120.),
    5: (188., 189., 34.),
    6: (140., 86., 75.),
    7: (255., 152., 150.),
    8: (214., 39., 40.),
    9: (197., 176., 213.),
    10: (148., 103., 189.),
    11: (196., 156., 148.),
    12: (23., 190., 207.),
    13: (124., 232., 109.),
    14: (247., 182., 210.),
    15: (66., 188., 102.),
    16: (219., 219., 141.),
    17: (140., 57., 197.),
    18: (202., 185., 52.),
    19: (51., 176., 203.),
    20: (200., 54., 131.),
    21: (92., 193., 61.),
    22: (78., 71., 183.),
    23: (172., 114., 82.),
    24: (255., 127., 14.),
    25: (91., 163., 138.),
    26: (153., 98., 156.),
    27: (140., 153., 101.),
    28: (158., 218., 229.),
    29: (100., 125., 154.),
    30: (178., 127., 135.),
    31: (56., 23, 131.),
    32: (146., 111., 194.),
    33: (44., 160., 44.),
    34: (112., 128., 144.),
    35: (96., 207., 209.),
    36: (227., 119., 194.),
    37: (213., 92., 176.),
    38: (94., 106., 211.),
    39: (82., 84., 163.),
    40: (100., 85., 144.),
}


def dye_semantics(_plydata: PlyData, clear_unknown=True) -> PlyData:
    assert 'label' in _plydata['vertex'].data.dtype.fields
    plydata = deepcopy(_plydata)
    if clear_unknown:
        plydata['vertex']['red'] = 0
        plydata['vertex']['green'] = 0
        plydata['vertex']['blue'] = 0
    for cate in range(41):
        mask = plydata['vertex']['label'] == cate
        red, green, blue = SCANNET_COLOR_MAP[cate]
        plydata['vertex']['red'][mask] = int(red)
        plydata['vertex']['green'][mask] = int(green)
        plydata['vertex']['blue'][mask] = int(blue)
    return plydata
