import logging

from datetime import timedelta, datetime

from app import app
from data.database import LogEntry

logger = logging.getLogger(__name__)

LOG_FORMAT = "%(asctime)s [%(process)d] [%(levelname)s] [%(name)s] %(message)s"
BATCH_SIZE = 1000

def delete_old_logentries(delete_before):
  delete_up_to_id = (LogEntry
    .select(LogEntry.id)
    .where(LogEntry.datetime <= delete_before)
    .order_by(LogEntry.id.desc())
    .limit(1)
    .tuples())[0][0]
  logger.debug('Deleting up to id: %s', delete_up_to_id)

  start_from_id = (LogEntry
    .select(LogEntry.id)
    .order_by(LogEntry.id)
    .limit(1)
    .tuples())[0][0]
  logger.debug('Starting from id: %s', start_from_id)

  deleted = 1
  current_batch_end = min(start_from_id + BATCH_SIZE, delete_up_to_id)
  while deleted > 0 or current_batch_end < delete_up_to_id:
    deleted = (LogEntry
      .delete()
      .where(LogEntry.id <= current_batch_end)
      .execute())
    logger.debug('Deleted %s entries', deleted)
    current_batch_end = min(current_batch_end + BATCH_SIZE, delete_up_to_id)

if __name__ == '__main__':
  logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)

  now = datetime.now()
  one_month_ago = now - timedelta(days=30)

  delete_old_logentries(one_month_ago)