import requests
from datetime import datetime, timedelta
import logging

MAX_BATCH = 20
DATE_TIME_FORMAT = "%d/%m/%Y %H:%M"
#SERVER_URL = "http://localhost:8080"
SERVER_URL = "https://dev.wifisensor.pro"
API_SECURE_TOKEN = ""
TELEGRAM_BOT_TOKEN = ""

def sendTelegramMessage(token, chatId, messageText):
   defaultToken = TELEGRAM_BOT_TOKEN
   token = defaultToken if token is None else token
   #potential attack point - URL constructed with values from outside
   url = f"https://api.telegram.org/bot{token}/sendMessage?chat_id={chatId}&text={messageText}"
   result = requests.get(url).json() # Эта строка отсылает сообщение
   logging.debug(f"sent telegram message to chat {chatId} with result: {result}")
   return result

def processResponseMessages(data_list):
    for item in data_list:
        message = item.get('messageText')
        tId = item.get('receiver').get('telegramId')
        token = item.get('receiver').get('telegramToken')
        result = sendTelegramMessage(token, tId, message)
        logging.debug(f"telegram send result {result}")
    return

def requestMsgCount(fromDate, toDate):
    with requests.Session() as s:
        s.headers.update({'X-API-Key': API_SECURE_TOKEN})
        payload = {'fromDate': fromDate, 'toDate': toDate}
        headers = {}
        cnt = 0
        with s.get(f"{SERVER_URL}/api/messages/count", params=payload, headers=headers) as resp:
            if (resp.status_code != 200):
                logging.warning(f"Request api/messages returned {resp.status_code}")
                logging.info(resp)
            else:
                cnt = resp.json()

    logging.info(f"messages count for period {fromDate} - {toDate} is {cnt}")
    return cnt

def deleteMessages(fromDate, toDate, limit, idAfter):
    payload = {'fromDate': fromDate, 'toDate': toDate}

    if not (limit is None):
        payload['limit'] = limit

    if not (idAfter is None):
        payload['after'] = idAfter

    headers = {}
    nextId = None

    with requests.Session() as s:
        s.headers.update({'X-API-Key': API_SECURE_TOKEN})

        with s.delete(f"{SERVER_URL}/api/messages", params=payload, headers=headers) as resp:
            if (resp.status_code == 204):
                logging.info(f"removed messages for request {payload}")
            elif (resp.status_code == 404):
                logging.info(f"messages to remove not found for request {payload}")
            else:
                logging.warning(f"Request api/messages returned {resp.status_code}")
                logging.debug(resp)

    return

def requestMessagesAndTelegramIt(day: datetime, limit, idAfter):
    toDate = day.strftime(DATE_TIME_FORMAT) #fromDate'13/01/2026 00:00'
    fromDate = (day - timedelta(days=1)).strftime(DATE_TIME_FORMAT)
    payload = {'fromDate': fromDate, 'toDate': toDate} #'remove' : 'true'

    if not (limit is None):
        payload['limit'] = limit

    if not (idAfter is None):
        payload['after'] = idAfter

    headers = {}
    nextId = None

    with requests.Session() as s:
        s.headers.update({'X-API-Key': API_SECURE_TOKEN})

        with s.get(f"{SERVER_URL}/api/messages", params=payload, headers=headers) as resp:
            if (resp.status_code != 200):
                logging.warning(f"Request api/messages returned {resp.status_code}")
                logging.debug(resp)
            else:
                nextId = resp.headers.get('X-RESP-NEXT')
                data_list = resp.json()

                if isinstance(data_list, list):
                    logging.info(f"result for request {payload} is {len(data_list)} messages and nextId {nextId}")
                    processResponseMessages(data_list)
                    deleteMessages(fromDate, toDate, limit, idAfter)

    return nextId

def requestCntAndMessagesAndTelegramIt(day: datetime):

    toDate = day.strftime(DATE_TIME_FORMAT) #fromDate'13/01/2026 00:00'
    fromDate = (day - timedelta(days=1)).strftime(DATE_TIME_FORMAT)

    cnt: int = requestMsgCount(fromDate, toDate)

    if (cnt <= 0):
        logging.info("requested count is 0, messages not requested")
        return

    if (cnt < MAX_BATCH):
        requestMessagesAndTelegramIt(datetime.now(), cnt, None)
    else:
        nextId = None

        while True:
            nextId = requestMessagesAndTelegramIt(datetime.now(), MAX_BATCH, nextId)

            logging.debug(f"nextId: '{nextId}'\n")

            if nextId is None:
                break # exit the loop

    return

#logging.basicConfig(level=logging.DEBUG, filename="pull_messages_log.log",filemode="w")
logging.basicConfig(level=logging.INFO)
requestCntAndMessagesAndTelegramIt(datetime.now())
