from fastapi import APIRouter, Depends, Form, Query, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, and_, text from typing import List, Optional from app.db.session import get_db from app.services.gamification_service import GamificationService from app.models.service import ServiceProfile, ExpertiseTag, ServiceExpertise router = APIRouter() # --- 🎯 SZERVIZ VADÁSZAT (Service Hunt) --- @router.post("/hunt") async def register_service_hunt( name: str = Form(...), lat: float = Form(...), lng: float = Form(...), db: AsyncSession = Depends(get_db) ): """ Új szerviz-jelölt rögzĂ­tĂ©se a staging tĂĄblĂĄba jutalompontĂ©rt. """ # Új szerviz-jelölt rögzĂ­tĂ©se await db.execute(text(""" INSERT INTO data.service_staging (name, fingerprint, status, raw_data) VALUES (:n, :f, 'pending', jsonb_build_object('lat', :lat, 'lng', :lng)) """), {"n": name, "f": f"{name}-{lat}-{lng}", "lat": lat, "lng": lng}) # MB 2.0 Gamification: 50 pont a felfedezĂ©sĂ©rt # TODO: A 1-es ID helyett a bejelentkezett felhasznĂĄlĂłt kell hasznĂĄlni (current_user.id) await GamificationService.award_points(db, 1, 50, f"Service Hunt: {name}") await db.commit() return {"status": "success", "message": "Discovery registered and points awarded."} # --- 🔍 SZERVIZ KERESƐ (Service Search) --- @router.get("/search") async def search_services( expertise_key: Optional[str] = Query(None, description="Szakmai cĂ­mke (pl. brake_service)"), city: Optional[str] = Query(None, description="VĂĄros szƱrĂ©s"), min_confidence: int = Query(0, description="Minimum hitelessĂ©gi szint (0-2)"), db: AsyncSession = Depends(get_db) ): """ Szakmai szempontĂș keresƑmotor, ami a validĂĄlt cĂ­mkĂ©k alapjĂĄn szƱr. """ # Alap lekĂ©rdezĂ©s: Szervizek, akiknek van szakĂ©rtelmĂŒk query = select(ServiceProfile).join(ServiceProfile.expertises).join(ServiceExpertise.tag) filters = [] if expertise_key: filters.append(ExpertiseTag.key == expertise_key) if city: filters.append(ServiceProfile.city.ilike(f"%{city}%")) if min_confidence > 0: filters.append(ServiceExpertise.confidence_level >= min_confidence) if filters: query = query.where(and_(*filters)) result = await db.execute(query.distinct()) services = result.scalars().all() return services