#!/usr/bin/env python
#
# Copyright (C) 2019 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""
Helper script to generate tedious strings.xml permutations
"""

from string import Template

verbs = ["write","trash","untrash","delete"]
datas = [("audio","audio file"),("video","video"),("image","photo"),("generic","item")]

print '''
<!-- ========================= BEGIN AUTO-GENERATED BY gen_strings.py ========================= -->'''

for verb in verbs:
    verblabel = verb
    if verb == "write":
        verblabel = "modify"

    verblabelcaps = verblabel[0].upper() + verblabel[1:]
    if verb == "trash":
        verblabelcaps = "Move to trash"
    if verb == "untrash":
        verblabelcaps = "Move out of trash"

    print '''
<!-- ========================= %s STRINGS ========================= -->
''' % (verb.upper())
    for data, datalabel in datas:
        if verb == "trash":
            print Template('''
<!-- Dialog title asking if user will allow $verb permission to the $data item displayed below this string. [CHAR LIMIT=128] -->
<plurals name="permission_${verb}_${data}">
    <item quantity="one">Allow <xliff:g id="app_name" example="Gmail">^1</xliff:g> to move this $datalabel to trash?</item>
    <item quantity="other">Allow <xliff:g id="app_name" example="Gmail">^1</xliff:g> to move <xliff:g id="count" example="42">^2</xliff:g> ${datalabel}s to trash?</item>
</plurals>
''').substitute(vars()).strip("\n")

        elif verb == "untrash":
            print Template('''
<!-- Dialog title asking if user will allow $verb permission to the $data item displayed below this string. [CHAR LIMIT=128] -->
<plurals name="permission_${verb}_${data}">
    <item quantity="one">Allow <xliff:g id="app_name" example="Gmail">^1</xliff:g> to move this $datalabel out of trash?</item>
    <item quantity="other">Allow <xliff:g id="app_name" example="Gmail">^1</xliff:g> to move <xliff:g id="count" example="42">^2</xliff:g> ${datalabel}s out of trash?</item>
</plurals>
''').substitute(vars()).strip("\n")

        else:
            print Template('''
<!-- Dialog title asking if user will allow $verb permission to the $data item displayed below this string. [CHAR LIMIT=128] -->
<plurals name="permission_${verb}_${data}">
    <item quantity="one">Allow <xliff:g id="app_name" example="Gmail">^1</xliff:g> to $verblabel this $datalabel?</item>
    <item quantity="other">Allow <xliff:g id="app_name" example="Gmail">^1</xliff:g> to $verblabel <xliff:g id="count" example="42">^2</xliff:g> ${datalabel}s?</item>
</plurals>
''').substitute(vars()).strip("\n")

print '''
<!-- ========================= END AUTO-GENERATED BY gen_strings.py ========================= -->
'''
