from flask import Flask, Response
import cv2
import io
import os
import time
import requests
import socketio
from dotenv import load_dotenv

INTERVAL_SECONDS = 3
cameraId = 0
device = None
cap = None
pin = None

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, World!"

@app.route('/shot.jpg')
def snapshot_opencv():  
    cap = initOpenCV()  
    ret, frame = cap.read()
    cap.release()
    if not ret:
        return "Failed to capture image", 500
    success, encoded_image = cv2.imencode('.jpg', frame)
    if not success:
        return "Failed to encode image", 500
    jpg_bytes = io.BytesIO(encoded_image.tobytes())
    return Response(jpg_bytes.getvalue(), mimetype='image/jpeg')

def capture_and_upload():
    print("capture_and_upload")
    cap = initOpenCV()  
    ret, frame = cap.read()
    if not ret:
        print("Failed to grab frame.")
        return
    _, jpeg_data = cv2.imencode('.jpg', frame)
    img_bytes = io.BytesIO(jpeg_data)
    files = {
        "image": ("webcam.jpg", img_bytes.getvalue(), "image/jpeg")
    }
    try:
        url = "https://www.spotter.se/api/upload/" + pin
        r = requests.post(url, files=files)
        if r.status_code != 200:
            print(f"Upload failed: {r.status_code} {r.text}")
            return
        else:
            print("Uploaded successfully.")
    except Exception as e:
        print(f"Upload error: {e}")

load_dotenv()
pin = os.getenv("pin")

def initOpenCV():
    cameraId = os.getenv("device", "0")
    cap = cv2.VideoCapture(int(cameraId))
    if not cap.isOpened():            
        print("Camera not accessible")
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
    cap.set(cv2.CAP_PROP_FPS, 30) 
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
    for i in range(0,30):
        ret, frame = cap.read()
    return cap

sio = socketio.Client()

@sio.event
def connect():
    print('Connected to Socket.IO server')
    sio.emit('register', {'pin':pin})

# Event handler for disconnection
@sio.event
def disconnect():
    print('Disconnected from Socket.IO server')

# Event handler for the 'takePhoto' event
@sio.on("trigger")
def on_trigger(data):
    print('Received trigger message:', data)
    capture_and_upload()


sio.connect('https://www.spotter.se')

if __name__ == '__main__':    
    app.run(debug=False)
