# Copyright 2020 Project U-Ray Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import re
import sys
import json
# Usage: frames.txt tiles.txt tilegrid.json

frame_line_re = re.compile(r'0x([0-9A-Fa-f]+).*')

frame_rc_height = {}

with open(sys.argv[1], 'r') as f:
    for line in f:
        m = frame_line_re.match(line)
        if not m:
            continue
        frame = int(m.group(1), 16)
        bus = (frame >> 24) & 0x7
        half = (frame >> 23) & 0x1
        row = (frame >> 18) & 0x1F
        col = (frame >> 8) & 0x3FF
        minor = frame & 0xFF
        if bus != 0 or half != 0:
            continue
        if (row, col) not in frame_rc_height:
            frame_rc_height[(row, col, frame & ~0xFF)] = minor + 1
        else:
            frame_rc_height[(row, col, frame & ~0xFF)] = max(
                frame_rc_height[(row, col)], minor + 1)

tiles_to_xy = {}
with open(sys.argv[2], 'r') as tilef:
    for line in tilef:
        sl = line.strip().split(",")
        if len(sl) < 4:
            continue
        x = int(sl[0])
        y = int(sl[1])
        name = sl[2]
        tiles_to_xy[name] = (x, y)

with open(sys.argv[3]) as tb_f:
    tbj = json.load(tb_f)

frames_to_tiles = {}
for tilename, tiledata in tbj.items():
    tile_offset = 0
    for chunk in tiledata:
        frame, start, size = chunk
        if frame not in frames_to_tiles:
            frames_to_tiles[frame] = []
        name = tilename.split(":")[0]
        frames_to_tiles[frame].append((start, tiles_to_xy[name][1],
                                       tiles_to_xy[name][0], name))
        tile_offset += size

for frame, tiles in frames_to_tiles.items():
    tiles.sort()

for rc, height in sorted(frame_rc_height.items()):
    row, col, frame = rc
    line = "%08x %6d %6d %6d" % (frame, row, col, height)
    print(line)
    frame = (row << 18) | (col << 8)
    last_start = 0
    if frame in frames_to_tiles and len(frames_to_tiles[frame]) > 0:
        for tile in frames_to_tiles[frame]:
            start, ty, tx, tname = tile
            print("                            %6d (%4d) %6d %6d %s" %
                  (start, start - last_start, tx, ty, tname))
            last_start = start
