#!/usr/bin/env python3
# *****************************************************************************
# NICOS, the Networked Instrument Control System of the MLZ
# Copyright (c) 2009-2025 by the NICOS contributors (see AUTHORS)
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Module authors:
#   Alexander Lenz <alexander.lenz@frm2.tum.de>
#
# *****************************************************************************

"""
Utility script for reformatting NICOS setup files via yapf
(https://github.com/google/yapf).
"""

import argparse
import difflib
import logging
import sys
from os import path

try:
    from nicostools.utils import format_setup_text
except ImportError:
    sys.path.insert(0, path.dirname(path.dirname(path.realpath(__file__))))
    from nicostools.utils import format_setup_text


def parseArgv(argv):
    parser = argparse.ArgumentParser(
        description = 'Reformat NICOS setup files', conflict_handler = 'resolve'
    )

    parser.add_argument('-v',
                        '--verbose',
                        action='store_true',
                        help='Verbose logging',
                        default=False)
    parser.add_argument('-i',
                        '--inplace',
                        action='store_true',
                        help='Reformat inplace',
                        default=False)
    parser.add_argument('-d',
                        '--diff',
                        action='store_true',
                        help='Show the diff',
                        default=False)

    parser.add_argument('files',
                        nargs='+',
                        help='Files to reformat',
                        default=[])

    return parser.parse_args(argv)


def reformatFile(fn, inplace=False, diff=False):
    logging.debug('Reformatting %s ...', fn)

    with open(fn, 'r', encoding='utf-8') as f:
        origin = f.read()

    result = format_setup_text(origin)

    if inplace:
        with open(fn, 'w', encoding='utf-8') as f:
            f.write(result)
    if diff:
        diff = difflib.unified_diff(origin.splitlines(), result.splitlines())
        # TODO: this diff is not very helpful, another format may be better
        print('\n'.join(diff))
    elif not inplace:
        print(result, end='')


def main(argv=None):
    if argv is None:
        argv = sys.argv
    args = parseArgv(argv[1:])

    logLevel = logging.INFO

    if args.verbose:
        logLevel = logging.DEBUG

    logging.basicConfig(level=logLevel,
                        format='[%(asctime)-15s][%(levelname)s]: %(message)s')

    for entry in args.files:
        reformatFile(entry, args.inplace, args.diff)


if __name__ == '__main__':
    sys.exit(main(sys.argv))
