from flask import Flask, request, jsonify, send_from_directory
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity
from flask_socketio import SocketIO, emit
import mysql.connector
import smtplib
from email.mime.text import MIMEText
from twilio.rest import Client

app = Flask(__name__, static_folder='/var/www/html/sistema/sos', static_url_path='')
socketio = SocketIO(app)
app.config['SECRET_KEY'] = 'sua_chave_secreta_aqui'
app.config['JWT_SECRET_KEY'] = 'sua_chave_jwt_aqui'

conn = mysql.connector.connect(
    host="localhost",
    database="sos",
    user="root",
    password="152535ff"
)
cursor = conn.cursor()

@app.route('/')
def index():
    return send_from_directory('/var/www/html/sistema/sos', 'login.html')

@app.route('/panic.html')
@jwt_required()
def panic_page():
    return send_from_directory('/var/www/html/sistema/sos', 'panic.html')

@app.route('/contacts.html')
@jwt_required()
def contacts_page():
    return send_from_directory('/var/www/html/sistema/sos', 'contacts.html')

@app.route('/style.css')
def style():
    return send_from_directory('/var/www/html/sistema/sos', 'style.css')

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    cursor.execute("SELECT id FROM users WHERE username=%s AND password=%s", (username, password))
    user = cursor.fetchone()
    if user:
        access_token = create_access_token(identity=user[0])
        return jsonify({'token': access_token}), 200
    return jsonify({'error': 'Credenciais inválidas'}), 401

@app.route('/contacts', methods=['GET', 'POST'])
@jwt_required()
def manage_contacts():
    user_id = get_jwt_identity()
    if request.method == 'GET':
        cursor.execute("SELECT name, phone, email FROM emergency_contacts WHERE user_id = %s", (user_id,))
        return jsonify(cursor.fetchall())
    else:
        data = request.json
        cursor.execute("INSERT INTO emergency_contacts (user_id, name, phone, email) VALUES (%s, %s, %s, %s)",
                       (user_id, data['name'], data['phone'], data['email']))
        conn.commit()
        return jsonify({'status': 'success'}), 200

@app.route('/panic', methods=['POST'])
@jwt_required()
def panic():
    data = request.json
    user_id = get_jwt_identity()
    lat, lng = data['latitude'], data['longitude']
    cursor.execute("INSERT INTO panic_events (user_id, latitude, longitude, timestamp) VALUES (%s, %s, %s, NOW())",
                   (user_id, lat, lng))
    conn.commit()

    socketio.emit('panic_alert', {'user_id': user_id, 'lat': lat, 'lng': lng}, broadcast=True)

    TWILIO_SID = "SEU_SID_TWILIO"
    TWILIO_TOKEN = "SEU_TOKEN_TWILIO"
    TWILIO_PHONE = "SEU_NUMERO_TWILIO"
    EMAIL_USER = "seu_email@gmail.com"
    EMAIL_PASS = "sua_senha_app"

    client = Client(TWILIO_SID, TWILIO_TOKEN)
    cursor.execute("SELECT phone, email FROM emergency_contacts WHERE user_id = %s", (user_id,))
    contacts = cursor.fetchall()
    for phone, _ in contacts:
        client.messages.create(body=f"🚨 Emergência! Usuário {user_id} em {lat},{lng}", from_=TWILIO_PHONE, to=phone)

    msg = MIMEText(f"Emergência! Localização: {lat},{lng}")
    msg['Subject'] = 'Alerta de Pânico'
    msg['From'] = EMAIL_USER
    for _, email in contacts:
        if email:
            msg['To'] = email
            with smtplib.SMTP('smtp.gmail.com', 587) as server:
                server.starttls()
                server.login(EMAIL_USER, EMAIL_PASS)
                server.send_message(msg)

    print(f"🚨 Pânico acionado! Usuário {user_id} em {lat},{lng}")
    return jsonify({'status': 'success'}), 200

if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=8081, debug=True)
