import cv2
import numpy as np
import cv2
import mediapipe as mp
import cv2
import pandas as pd
import datetime
from django.core.mail import EmailMessage
from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand
from multiprocessing import Process
from myprofile.models import *
from ultralytics import YOLO
from django.conf import settings

def process_device(camera_id):

    camera = Camera.objects.get(id=camera_id)
    cap = cv2.VideoCapture(camera.rtsp_url)

    if not cap.isOpened():
        print("Error opening video file.")
        return

    while True:
        ret, frame = cap.read()

        if not ret:
            break

        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        lower_red = np.array([0, 100, 100])
        upper_red = np.array([10, 255, 255])

        mask = cv2.inRange(hsv, lower_red, upper_red)

        contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        if contours:
            x, y, w, h = cv2.boundingRect(np.vstack(contours))
            
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
            cv2.putText(frame, 'ALERT: FIRE', (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
            print("FIRE DETECTION")

            # save the frame in the database in Alert model
            alert = Alert(camera=camera, alert_message = f'ALERT: FIRE Detect in {camera.camera_name}')

            # Create a CameraEvent object for Fire Detection
            fire_event = CameraEvent.objects.get_or_create(camera_event = 'FireDetection')[0]
            alert.camera_events = fire_event
            alert.save()

            # save amera Incharge
            alert.camera_incharge.set(camera.camera_user.all())

            # Save alert image to the database
            _, encoded_frame = cv2.imencode('.jpg', frame)
            image_file = ContentFile(encoded_frame.tobytes())
            alert.frame.save(f'fall_{datetime.datetime.now()}.jpg', image_file)

            # Send an email notification to the camera incharge
            # subject = f'Alert: Person detected in {camera.camera_name}'
            # message = f'A person has been detected in {camera.camera_name} at {datetime.datetime.now()}'
            # from_email = settings.EMAIL_HOST_USER
            # recipient_list = ['kuldip.nettyfy@gmail.com']
            # email = EmailMessage(subject, message, from_email, recipient_list)
            # email.attach_file(alert.frame.path)
            # email.send()
        cv2.imshow('Fire Detection', frame)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

video_path = 'fire.mp4'



class Command(BaseCommand):
    help = 'Triggers alerts based on video analysis'

    def handle(self, *args, **options):
        camera = Camera.objects.filter(is_enabled=True)

        processes = []

        for cam in camera:
            process = Process(target=process_device, args=(cam.id,))
            process.start()
            processes.append(process)

        for process in processes:
            process.join()
