import json
from pathlib import Path
import urllib.request
import tarfile
import io

root = Path(__file__).resolve().parent
config = json.loads((root / 'tokens.json').read_text(encoding='utf-8'))
icons = ['book-open', 'layout-dashboard', 'users', 'graduation-cap', 'clipboard-list', 'calculator', 'folder-open', 'file-text', 'chart-column', 'settings', 'chevron-down', 'chevron-right', 'chevron-left', 'menu', 'x', 'plus', 'search', 'check', 'circle-check', 'triangle-alert', 'info', 'upload', 'download', 'ellipsis', 'bell', 'log-out', 'lock', 'loader-circle', 'calendar-days', 'clock', 'arrow-right', 'filter']
(root / 'icons').mkdir(exist_ok=True)

source_file = root / 'icons' / 'source.json'
version = json.loads(source_file.read_text(encoding='utf-8'))['version'] if source_file.exists() else 'latest'
with urllib.request.urlopen(f'https://registry.npmjs.org/lucide-static/{version}', timeout=30) as response:
    package = json.load(response)
with urllib.request.urlopen(package['dist']['tarball'], timeout=30) as response:
    archive_bytes = response.read()
assets = {}
with tarfile.open(fileobj=io.BytesIO(archive_bytes), mode='r:gz') as archive:
    for name in icons:
        content = archive.extractfile(f'package/icons/{name}.svg').read().decode('utf-8')
        (root / 'icons' / f'{name}.svg').write_text(content, encoding='utf-8')
        assets[name] = content
    license_member = next((m for m in archive.getmembers() if m.name.lower() in ['package/license', 'package/license.md', 'package/license.txt']), None)
    if license_member:
        (root / 'icons' / 'LICENSE').write_bytes(archive.extractfile(license_member).read())
(root / 'icons' / 'source.json').write_text(json.dumps({'package': 'lucide-static', 'version': package['version'], 'tarball': package['dist']['tarball']}, indent=2), encoding='utf-8')
(root / 'icons.json').write_text(json.dumps(assets, indent=2), encoding='utf-8')

def css_name(name):
    return name.replace('/', '-').replace(' ', '-').lower()

lines = [':root {', f'  --font-family-sans: "{config["font"]}", sans-serif;']
for name, value in config['primitives'].items():
    lines.append(f'  --primitive-{name}: {value};')
for name, values in config['colors'].items():
    lines.append(f'  --color-{css_name(name)}: var(--primitive-{values[0]});')
for group in ['spacing', 'radius', 'sizes']:
    for name, value in config[group].items():
        lines.append(f'  --{group}-{name}: {value}px;')
for name, value in config['type'].items():
    lines.extend([f'  --type-{css_name(name)}-size: {value["size"]}px;', f'  --type-{css_name(name)}-line: {value["line"]}px;'])
lines.extend(['}', '', '[data-theme="dark"] {'])
for name, values in config['colors'].items():
    lines.append(f'  --color-{css_name(name)}: var(--primitive-{values[1]});')
lines.append('}')
lines.extend(['', ':root { --icon-foreground: var(--color-text-secondary); }'])
for mode, value in config.get('iconContext', {}).items():
    lines.append(f'[data-icon-tone="{mode.lower().replace(" ", "-")}"] {{ --icon-foreground: var(--color-{css_name(value)}); }}')
(root / 'tokens.css').write_text('\n'.join(lines) + '\n', encoding='utf-8')
print(json.dumps({'icons': len(assets), 'semanticColors': len(config['colors']), 'css': str(root / 'tokens.css')}))
