from flask import Flask, request
import sqlite3
import re
from datetime import datetime, timedelta

app = Flask(__name__)

# Инициализация базы данных SQLite
def init_db():
    conn = sqlite3.connect('/var/www/html/webhook/locations.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS locations
                 (device_id TEXT, latitude REAL, longitude REAL, time TEXT, pressure TEXT, wearState TEXT)''')
    conn.commit()
    conn.close()

init_db()

@app.route('/webhook', methods=['POST'])
def webhook():
    try:
        data = request.get_json()
        device_id = data.get('end_device_ids', {}).get('device_id', 'unknown')
        payload = data.get('uplink_message', {}).get('decoded_payload', {})

        latitude = 0.0
        longitude = 0.0
        time_value = 'N/A'
        pressure = 'N/A'
        wearState = 'N/A'
        is_valid = False

        # Обработка старого формата (строка)
        if isinstance(payload, str):
            payload_dict = {}
            matches = re.findall(r'(\w+)"([^"]*)"', payload)
            for key, value in matches:
                try:
                    payload_dict[key] = float(value) if key in ['latitude', 'longitude'] else value
                except ValueError:
                    payload_dict[key] = value
            payload = payload_dict

            if (payload.get('gpsState') == 'gps location success' and
                payload.get('latitude', 0) != 0.0 and
                payload.get('longitude', 0) != 0.0):
                is_valid = True
                latitude = payload.get('latitude', 0)
                longitude = payload.get('longitude', 0)
                time_value = datetime.now().strftime('%Y-%m-%dT%H:%M:%S.000Z') if payload.get('time', '').startswith('"1970') else payload.get('time', 'N/A').replace('"', '')
                pressure = payload.get('pressure', 'N/A')
                wearState = payload.get('wearState', 'N/A')

        # Обработка нового формата (словарь с capitalized ключами)
        elif isinstance(payload, dict):
            if (payload.get('Message type') == 'GNSSPosition' and
                payload.get('Latitude', 0) != 0.0 and
                payload.get('Longitude', 0) != 0.0):
                is_valid = True
                latitude = payload.get('Latitude', 0)
                longitude = payload.get('Longitude', 0)
                time_value = payload.get('Time', 'N/A').replace('"', '')
                pressure = payload.get('pressure', 'N/A')  # Поддержка pressure, если появится
                wearState = payload.get('wearState', 'N/A')  # Поддержка wearState, если появится
            elif (payload.get('gpsState') == 'gps location success' and
                  payload.get('latitude', 0) != 0.0 and
                  payload.get('longitude', 0) != 0.0):
                is_valid = True
                latitude = payload.get('latitude', 0)
                longitude = payload.get('longitude', 0)
                time_value = datetime.now().strftime('%Y-%m-%dT%H:%M:%S.000Z') if payload.get('time', '').startswith('"1970') else payload.get('time', 'N/A').replace('"', '')
                pressure = payload.get('pressure', 'N/A')
                wearState = payload.get('wearState', 'N/A')

        # Сохранение в SQLite, если валидно
        if is_valid:
            conn = sqlite3.connect('/var/www/html/webhook/locations.db')
            c = conn.cursor()
            c.execute('''INSERT INTO locations (device_id, latitude, longitude, time, pressure, wearState)
                         VALUES (?, ?, ?, ?, ?, ?)''',
                      (device_id, latitude, longitude, time_value, pressure, wearState))
            # Очистка данных старше 1 дня
            c.execute('DELETE FROM locations WHERE time < ?', ((datetime.now() - timedelta(days=1)).strftime('%Y-%m-%dT%H:%M:%S.000Z'),))
            conn.commit()
            conn.close()

        return '', 200
    except Exception as e:
        print(f"Error: {e}")
        return '', 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)
