#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright European Organization for Nuclear Research (CERN) since 2012
#
# 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.

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

import argparse
import signal

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


def get_parser():
    """
    Returns the argparse parser.
    """
    parser = argparse.ArgumentParser(description="The Abacus-Account daemon is responsible for updating account usages. It checks if there are new entries in the UpdatedAccountCounter table and updates the account counters in the AccountCounter table by adding or substrating the amount and size of files and recalculating the quotas.", epilog='''
Upload a file::

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

Check account usage::

  $ rucio list-account-usage username
  +-------+---------+---------+--------------+
  | RSE   | USAGE   | LIMIT   | QUOTA LEFT   |
  |-------+---------+---------+--------------|
  +-------+---------+---------+--------------+

Run the daemon::

  $ rucio-abacus-account --run-once

Check account usage again::

  $ rucio list-account-usage username
  +-------+------------+---------+--------------+
  | RSE   | USAGE      | LIMIT   | QUOTA LEFT   |
  |-------+------------+---------+--------------|
  | MOCK  | 211.724 kB | 0.000 B | 0.000 B      |
  +-------+------------+---------+--------------+

    ''', formatter_class=argparse.RawDescriptionHelpFormatter)
    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 account usage into history table every hour.')
    parser.add_argument('--sleep-time', action="store", default=10, type=int, help='Concurrency control: thread sleep time after each chunk of work')

    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, sleep_time=args.sleep_time)
    except KeyboardInterrupt:
        stop()
