from fastapi import HTTPException
from src.service.image_service import save_file
from src.db.mongodb import event_collection, participants_collection
from bson import ObjectId
from src.models.event_schema import Event
from datetime import datetime
import json

async def create_event(data: dict, header_image, footer_image, kml_file):
        try: 
            header_path = save_file(header_image, "headers")
            footer_path = save_file(footer_image, "footers")
            kml_path = save_file(kml_file, "kmls", validate=False)
        
            event_data = {
                "name": data["name"],
                "organizer": data["organizer"],
                "venue": data["venue"],
                "start_date": data["start_date"],
                "end_date": data["end_date"],
                "location": {"latitude": data["latitude"], "longitude": data["longitude"]},
                "category": json.loads(data["category"]),
                "category_class": json.loads(data["category_class"]),
                "competitor": data["competitor"],
                "header_image": header_path,
                "footer_image": footer_path,
                "kml_file": kml_path
            }
            event = Event(**event_data)
            result = event_collection.insert_one(event.model_dump())
            return {"message": "Event created", "id": str(result.inserted_id)}
        except Exception as e:
            raise HTTPException(status_code=500, detail=f"Error creating event: {str(e)}")


def get_event(event_id: str):
    try:
        event = event_collection.find_one({"_id": ObjectId(event_id)})
        if not event:
            raise HTTPException(status_code=404, detail="Event not found")
        
        event_data = {
            "name": event.get("name", ""),
            "organizer": event.get("organizer", ""),
            "venue": event.get("venue", ""),
            "start_date": event.get("start_date"),
            "end_date": event.get("end_date"),
            "location": {
                "latitude": event["location"]["latitude"],
                "longitude": event["location"]["longitude"]
            },
            "category": event.get("category", []),
            "category_class": event.get("category_class", []),
            "competitor": event.get("competitor", ""),
            "header_image": event.get("header_image", "").replace("\\", "/"),
            "footer_image": event.get("footer_image", "").replace("\\", "/"),
            "kml_file": event.get("kml_file", "").replace("\\", "/")
        }

        return Event(**event_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error fetching event: {str(e)}")

def get_all_events():
    try:
        now = datetime.now()
        events = []
        all_events = event_collection.find({"start_date": {"$gte": now}})
        for event in all_events:
            event_data = {
                "event_id": str(event["_id"]),
                "name": event.get("name", ""),
                "organizer": event.get("organizer", ""),
                "venue": event.get("venue", ""),
                "start_date": event.get("start_date"),
                "end_date": event.get("end_date"),
                "location": {
                    "latitude": event["location"]["latitude"],
                    "longitude": event["location"]["longitude"]
                },
                "category": event.get("category", []),
                "category_class": event.get("category_class", []),
                "competitor": event.get("competitor", ""),
                "header_image": event.get("header_image", "").replace("\\", "/"),
                "footer_image": event.get("footer_image", "").replace("\\", "/"),
                "kml_file": event.get("kml_file", "").replace("\\", "/")
            }
            events.append(event_data)
        return events
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error fetching event: {str(e)}")
    

def apply_events(payload):
    try:
        event = event_collection.find({"_id": ObjectId(payload.event_id)})
        if not event:
            raise HTTPException(status_code=404, detail="Events not found")
        
        join_event = {
            "event_id": ObjectId(payload.event_id),
            "user_id": ObjectId(payload.user_id),
            "crew_members": [member.dict() for member in payload.crew_members]
        }
        
        result = participants_collection.insert_one(join_event)
        
        return {"message": "Registered for event successfully", "participant_id": str(result.inserted_id)}
    
    except Exception as e:
            raise HTTPException(status_code=500, detail=f"Error joining event: {str(e)}")

