# Textures (web formats) and the conversion job list for the SKCombat models.
import os, re, json, sys
sys.path.insert(0, os.path.dirname(__file__))
from tif import open_rgba
A = 'D:/Downloads/Sketch Combat 240815/Sketch Combat v1/Assets'
S = sys.argv[1]
M = A + '/Materials'
tex = {
    'nature': (M + '/Tiles/[03]NatureI/[03]NatureI.tif', 'jpg'), 'greece': (M + '/Tiles/[01]AncientGreeceI/[01]AncientGreeceI.tif', 'jpg'),
    'alpha': (M + '/Tiles/[00]Misc/[00]SkAlpha.tif', 'png'), 'basic': (M + '/Misc/Basic.tif', 'png'), 'glow': (M + '/Tiles/[00]Misc/[00]SkSelfIllum.tif', 'jpg'),
}
for v in ('Normal', 'ArmorM', 'ArmorS', 'Blood', 'Ice', 'Mecha', 'Moss', 'Weapons'):
    p = M + '/Tokens/[06]Skeleton/[06]Skeleton(' + v + ').jpg'
    if os.path.exists(p): tex['skeleton-' + v.lower()] = (p, 'jpg')
for v in ('Crystal', 'Hairy', 'Infernal', 'Mecha', 'Moss', 'Stone', 'Widow'):
    p = M + '/Tokens/[07]Spider/[07]Spider(' + v + ').tif'
    if os.path.exists(p): tex['spider-' + v.lower()] = (p, 'jpg')
if '--tex' in sys.argv:
    for k, (p, fmt) in tex.items():
        im = open_rgba(p) if p.endswith('.tif') else __import__('PIL.Image', fromlist=['Image']).open(p).convert('RGBA')
        out = os.path.join(S, 'tex', k + '.' + fmt)
        (im.convert('RGB').save(out, quality=88) if fmt == 'jpg' else im.save(out, optimize=True))
        print(k, im.size, os.path.getsize(out) // 1024, 'KB')
# which atlas each source texture name means
IMG = {'Nature01.tif': 'nature', 'Woods01.jpg': 'nature', 'WoodsGround.jpg': 'nature', 'Dungeon01-Dimus.jpg': 'greece', 'Dungeon01.jpg': 'greece',
       'DungeonGround.jpg': 'greece', '00-SkAlpha.tif': 'alpha', '00-SkSelfIllum.tif': 'glow'}
def sk_tex(f, imgs):
    n = os.path.basename(f)
    for v in ('ArmorM', 'ArmorS', 'Blood', 'Ice', 'Mecha', 'Moss'):
        if v.lower() in n.lower():
            return ('skeleton-' if 'Skeleton' in n else 'spider-') + v.lower()
    if 'Skeleton' in n: return 'skeleton-normal'
    if 'Spider' in n:
        for v in ('Crystal', 'Hairy', 'Infernal', 'Widow', 'Stone'):
            if v.lower() in ' '.join(imgs).lower() or v in n: return 'spider-' + v.lower()
        return 'spider-moss' if 'plant' in ' '.join(imgs).lower() else 'spider-hairy'
    return None
PACK = {'Atrezzo/[00]Free': 'dungeon-props', 'Atrezzo/[01]AncientGreeceI': 'greece-props', 'Atrezzo/[03]NatureI': 'nature-props',
        'Platforms/[00]Free': 'dungeon-tiles', 'Platforms/[01]AncientGreeceI': 'greece-tiles', 'Platforms/[03]NatureI': 'nature-tiles',
        'Stuff/[00]Free': 'stuff', 'Tokens': 'creatures', '': 'dungeon-props'}
def name_of(f):
    n = os.path.splitext(os.path.basename(f))[0]
    n = re.sub(r'^xsi[A-Z]?_', '', n); n = re.sub(r'^DLC\d\d_', '', n)
    n = re.sub(r'(?<=[a-z0-9])(?=[A-Z])', '-', n).replace('_', '-')
    return re.sub(r'[^a-z0-9-]+', '-', n.lower()).strip('-')
survey = [x for x in json.load(open(os.path.join(S, 'survey.json'))) if 'err' not in x and x.get('meshes')]
jobs = []
for x in survey:
    f = x['f']
    if '[OLD]' in f or '/OLD/' in f or f.startswith(('Particles/', 'Plane1x1', 'xsi_platform')) or '[02]FxEffectsI' in f: continue
    parts = f.split('/')
    key = '/'.join(parts[:2]) if parts[0] in ('Atrezzo', 'Platforms', 'Stuff') else ('Tokens' if parts[0] == 'Tokens' else '')
    pack = PACK.get(key)
    if not pack: continue
    t = sk_tex(f, x['imgs']) if pack == 'creatures' else None
    if not t:
        t = next((IMG[i] for i in x['imgs'] if i in IMG), 'basic')
    kind = 'alpha' if t == 'alpha' else 'glow' if t == 'glow' else 'opaque'
    jobs.append({'src': A + '/FBXs/' + f, 'pack': pack, 'name': name_of(f), 'tex': t, 'kind': kind})
# creatures: a base body + one variant attachment, painted with that variant's texture
T = A + '/FBXs/Tokens'
jobs = [j for j in jobs if j['pack'] != 'creatures']
sk = T + '/[06]Skeleton/xsiT_Skeleton.fbx'
jobs.append({'src': sk, 'pack': 'creatures', 'name': 'skeleton', 'tex': 'skeleton-normal', 'kind': 'opaque'})
jobs.append({'src': T + '/[06]Skeleton/xsiT_SkeletonV3_Dead.fbx', 'pack': 'creatures', 'name': 'skeleton-dead', 'tex': 'skeleton-normal', 'kind': 'opaque'})
for v, f in (('armorm', 'ArmorM'), ('armors', 'ArmorS'), ('blood', 'Blood'), ('ice', 'Ice'), ('mecha', 'Mecha'), ('moss', 'Moss')):
    jobs.append({'src': sk, 'srcs': [sk, T + '/[06]Skeleton/xsiT_Skeleton_' + f + '.fbx'], 'pack': 'creatures', 'name': 'skeleton-' + {'armorm': 'armored', 'armors': 'shielded'}.get(v, v), 'tex': 'skeleton-' + v, 'kind': 'opaque'})
sp = T + '/[07]Spider/xsiT_Spider.fbx'
for v in ('Crystal', 'Hairy', 'Infernal', 'Mecha', 'Moss'):
    jobs.append({'src': sp, 'srcs': [sp, T + '/[07]Spider/xsiT_Spider_' + v + '.fbx'], 'pack': 'creatures', 'name': 'spider-' + v.lower(), 'tex': 'spider-' + v.lower(), 'kind': 'opaque'})
for v in ('stone', 'widow'):
    jobs.append({'src': sp, 'pack': 'creatures', 'name': 'spider-' + v, 'tex': 'spider-' + v, 'kind': 'opaque'})
F = T + '/[00]Free'
for f in sorted(os.listdir(F)):
    if f.endswith('.fbx') and f.startswith('xsiT_BaseV3'):
        n = name_of(f).replace('base-v3', 'figure').replace('figure-idle-', 'figure-')
        jobs.append({'src': F + '/' + f, 'pack': 'creatures', 'name': n, 'tex': 'basic', 'kind': 'opaque'})
for f in sorted(os.listdir(F + '/Human')):
    if f.endswith('.fbx'): jobs.append({'src': F + '/Human/' + f, 'pack': 'creatures', 'name': name_of(f).replace('human-f', 'woman').replace('human-m', 'man'), 'tex': 'basic', 'kind': 'opaque'})
jobs.append({'src': T + '/xsiT_Wolf.fbx', 'pack': 'creatures', 'name': 'wolf', 'tex': 'basic', 'kind': 'opaque'})
# floor tiles: keep one cell under their top (their columns reach ~6 cells underground)
for j in jobs:
    if j['pack'].endswith('-tiles'): j['cut'] = -1.0
# unique names per pack
seen = {}
for j in jobs:
    k = j['pack'] + '/' + j['name']
    if k in seen: seen[k] += 1; j['name'] += '-' + str(seen[k])
    else: seen[k] = 1
json.dump(jobs, open(os.path.join(S, 'jobs.json'), 'w'), indent=0)
import collections
print(len(jobs), collections.Counter(j['pack'] for j in jobs), collections.Counter(j['tex'] for j in jobs))
