#!/usr/bin/python3

# This script helps to rename and copy the golden images required to run the screenshot tests to the golden directory.
# To generate new golden images for a test, run the test on the emulator with the required device type, and download the screenshots from the device using adb
# The screenshots directory contains test.textproto files describing the screenshots and the folder they should be placed in to run the tests successfully
#
# Example of a textproto file:
# androidx.test.screenshot.proto.ScreenshotResultProto$ScreenshotResult@37d7ba5f
# current_screenshot_file_name: "androidx.emoji2.emojipicker.EmojiViewTest_testClear_sdk_g64_arm64_actual.png"
# location_of_golden_in_repo: "emoji2/emoji2-emojipicker/draw_and_clear_sdk_g64_arm64.png"
# repo_root_path: "platform/frameworks/support-golden"
# result: MISSING_GOLDEN
# result_value: 3

import argparse
import os
import shutil

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument("--screenshots-dir-path", required=True, dest="input_dir")
  args = parser.parse_args()
  rename_and_copy_files_to_new_location(args.input_dir)

def rename_and_copy_files_to_new_location(input_path):
  #Relative path to golden directory
  GOLDENDIR_REL_PATH = '../../../golden/'
  SCRIPT_PATH = os.path.realpath(os.path.dirname(__file__))
  GOLDENDIR_FULL_PATH = os.path.join(SCRIPT_PATH, GOLDENDIR_REL_PATH)
  output_path = GOLDENDIR_FULL_PATH

  # Fetching all screenshots
  files = os.listdir(input_path)
  copied_files = 0
  for file in files:
    if not file.endswith('.textproto'):
       continue
    current_file_path = os.path.join(input_path, file)
    with open(current_file_path) as current_file:
        input = ''
        output = ''
        for line in current_file.readlines():
            if line.startswith('current_screenshot_file_name'):
                input = input_path+line.split(':')[1].strip().replace('"', '')
            elif line.startswith('location_of_golden_in_repo'):
                output = output_path+line.split(':')[1].strip().replace('"', '')
        if input == '' or output == '':
           print('There was an error processing file -', file)
        else:
          shutil.copy(input, output)
          copied_files += 1

  print(copied_files, 'golden images copied successfully')

if __name__ == "__main__":
  main()