# -*- coding: utf-8 -*-
"""通用换图脚本：把指定媒体替换成广金照片（cover 裁切 + 按原图指标调色），不改任何颜色值。

用法：python _gduf_apply.py <源.pptx> <输出.pptx> <规格...>
      规格格式：媒体名=宽x高@裁切中心比例@目标明度@目标饱和
      例：image14.jpg=2130x1000@0.56@0.70@0.25
"""
import importlib.util, os, sys, zipfile

BASE = os.path.dirname(os.path.abspath(__file__))
spec = importlib.util.spec_from_file_location('g', os.path.join(BASE, '_gduf_images.py'))
G = importlib.util.module_from_spec(spec); spec.loader.exec_module(G)


def main():
    src, out = sys.argv[1], sys.argv[2]
    jobs = []
    for a in sys.argv[3:]:
        name, rest = a.split('=', 1)
        size, bias, tv, ts = rest.split('@')
        w, h = (int(x) for x in size.split('x'))
        jobs.append((name, (w, h), float(bias), float(tv), float(ts)))
    repl = {}
    for name, size, bias, tv, ts in jobs:
        im = G.cool_grade(G.cover_fill(size, bias), target_val=tv, target_sat=ts)
        p = os.path.join(BASE, '_tmp_' + name)
        im.save(p, quality=93)
        repl[name] = open(p, 'rb').read()
        print('  替换 %-14s %s（原图指标 明度%.2f/饱和%.2f）' % (name, im.size, tv, ts))
    zin = zipfile.ZipFile(src); zout = zipfile.ZipFile(out, 'w', zipfile.ZIP_DEFLATED)
    n = 0
    for item in zin.infolist():
        data = zin.read(item.filename)
        b = os.path.basename(item.filename)
        if item.filename.startswith('ppt/media/') and b in repl:
            data = repl[b]; n += 1
        zout.writestr(item, data)
    zout.close(); zin.close()
    for name, *_ in jobs:
        p = os.path.join(BASE, '_tmp_' + name)
        if os.path.exists(p): os.remove(p)
    print('已生成 %s（替换 %d 个媒体，颜色值未改）' % (out, n))


if __name__ == '__main__':
    main()
