#!/usr/bin/env python
# Copyright 2014-2018 CERN for the benefit of the ATLAS collaboration.
#
# 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.
#
# Authors:
# - Martin Barisits, <martin.barisits@cern.ch>, 2014
# - Vincent Garonne, <vgaronne@gmail.com>, 2018
# - Hannes Hansen, <hannes.jakob.hansen@cern.ch>, 2018-2019
#
# PY3K COMPATIBLE

"""
Abacus rse is a daemon to update rse counters.
"""

import argparse
import signal

from rucio.daemons.abacus.rse import run, stop


def get_parser():
    """
    Returns the argparse parser.
    """
    parser = argparse.ArgumentParser(description="The Abacus-RSE daemon is responsible for updating RSE usages. It checks if there are new entries in the UpdatedRSECounter table and updates the RSE counter in the RSECounter table by adding or substrating the amount of files and the size.", epilog='''
Upload a file to your RSE::

  $ rucio upload --rse MOCK --scope mock filename.txt

Check RSE usage::

  $ rucio list-rse-usage MOCK
  USAGE:
  ------
     files: 0
     used: 0.000 B
     rse: MOCK
     updated_at: 2018-11-30 14:28:34
     source: rucio
  ------

Run the daemon::

  $ rucio-abacus-rse --run-once

Check RSE usage again::

  $ rucio list-rse-usage MOCK
  USAGE:
  ------
      files: 1
      used: 213.481 kB
      rse: MOCK
      updated_at: 2018-12-03 08:58:33
      source: rucio
  ------
''')
    parser.add_argument("--run-once", action="store_true", default=False, help='One iteration only')
    parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: total number of threads on this process')
    parser.add_argument("--enable-history", action="store_true", default=False, help='Record RSE usage into history table every hour.')
    return parser


if __name__ == "__main__":

    signal.signal(signal.SIGTERM, stop)
    parser = get_parser()
    args = parser.parse_args()
    try:
        run(once=args.run_once, threads=args.threads, fill_history_table=args.enable_history)
    except KeyboardInterrupt:
        stop()
