#!/usr/bin/env python3
# Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import os
import shutil
import subprocess
import zipfile

import utils

def add_file_to_zip(file, destination, zip_file):
  with zipfile.ZipFile(zip_file, 'a') as zip:
    zip.write(file, destination)

def extract_all_that_matches(zip_file, destination, predicate):
  with zipfile.ZipFile(zip_file) as zip:
    names_to_extract = [name for name in zip.namelist() if predicate(name)]
    zip.extractall(path=destination, members=names_to_extract)
    return names_to_extract

def extract_member(zip_file, member, destination):
  with zipfile.ZipFile(zip_file) as zip:
    with utils.TempDir() as temp:
      zip.extract(member, path=temp)
      shutil.move(os.path.join(temp, member), destination)

def get_names_that_matches(zip_file, predicate):
  with zipfile.ZipFile(zip_file) as zip:
    return [name for name in zip.namelist() if predicate(name)]

def remove_files_from_zip(files, zip_file):
  assert os.path.exists(zip_file)
  cmd = ['zip', '-d', zip_file] + files
  subprocess.run(cmd)
