#!/usr/bin/env python3
"""
Garázs adatok ellenőrzése és javítása.
Ez a szkript ellenőrzi a teszt felhasználó szervezeti státuszát,
és felosztja a járműveket privát és céges flotta között.

Futtatás: docker compose exec sf_api python -m app.scripts.check_and_fix_garage_data
"""

import asyncio
import sys
from sqlalchemy import select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload

# Add the backend directory to the path
sys.path.insert(0, '/app')

from app.db.session import AsyncSessionLocal
from app.models.identity import User
from app.models.marketplace.organization import Organization, OrganizationMember
from app.models.vehicle.asset import Asset
# AssetCatalog is inside the asset module

async def main():
    """Fő végrehajtási logika."""
    print("=" * 60)
    print("GARÁZS ADATOK ELLENŐRZÉSE ÉS JAVÍTÁSA")
    print("=" * 60)
    
    async with AsyncSessionLocal() as db:
        # 1. Keressük meg a teszt felhasználót
        print("\n1. TESZT FELHASZNÁLÓ KERESÉSE...")
        stmt = select(User).where(User.email == "tester_pro@profibot.hu")
        result = await db.execute(stmt)
        test_user = result.scalar_one_or_none()
        
        if not test_user:
            print("❌ HIBA: A teszt felhasználó (tester_pro@profibot.hu) nem található!")
            return
        
        print(f"   ✅ Teszt felhasználó megtalálva: ID={test_user.id}, Email={test_user.email}")
        
        # 2. Ellenőrizzük, hogy a felhasználóhoz tartozik-e szervezet
        print("\n2. SZERVEZETI TAGSÁG ELLENŐRZÉSE...")
        org_stmt = (
            select(Organization)
            .join(OrganizationMember)
            .where(OrganizationMember.user_id == test_user.id)
            .where(Organization.is_deleted == False)
            .where(Organization.is_active == True)
        )
        org_result = await db.execute(org_stmt)
        user_organizations = org_result.scalars().all()
        
        if user_organizations:
            print(f"   ✅ A felhasználó már tagja {len(user_organizations)} szervezetnek:")
            for org in user_organizations:
                print(f"      - {org.name} (ID: {org.id}, Adószám: {org.tax_number})")
            target_org = user_organizations[0]
        else:
            print("   ℹ️  A felhasználó nem tagja egyetlen szervezetnek sem. Új szervezet létrehozása...")
            
            # Új szervezet létrehozása
            new_org = Organization(
                full_name="Teszt Flotta Kft.",
                name="Teszt Flotta",
                display_name="Teszt Flotta Kft.",
                tax_number="12345678-2-42",
                reg_number="01-23-456789",
                country_code="HU",
                language="hu",
                default_currency="HUF",
                address_zip="1234",
                address_city="Budapest",
                address_street_name="Teszt utca",
                address_street_type="utca",
                address_house_number="1",
                folder_slug="teszt-flotta",
                org_type="business",
                status="active",
                is_active=True,
                is_deleted=False,
                subscription_plan="FREE",
                base_asset_limit=10,
                owner_id=test_user.id
            )
            
            db.add(new_org)
            await db.flush()  # ID generáláshoz
            await db.refresh(new_org)
            
            # Szervezeti tagság létrehozása (ADMIN szerepkör)
            org_member = OrganizationMember(
                organization_id=new_org.id,
                user_id=test_user.id,
                role="ADMIN"
            )
            db.add(org_member)
            
            await db.commit()
            await db.refresh(new_org)
            
            target_org = new_org
            print(f"   ✅ Új szervezet létrehozva: {target_org.name} (ID: {target_org.id})")
        
        # 3. A felhasználó összes járművének lekérdezése
        print("\n3. FELHASZNÁLÓ JÁRMŰVEINEK LEKÉRDEZÉSE...")
        asset_stmt = (
            select(Asset)
            .where(Asset.owner_person_id == test_user.id)
            .options(selectinload(Asset.catalog))
        )
        asset_result = await db.execute(asset_stmt)
        user_assets = asset_result.scalars().all()
        
        print(f"   ✅ Összesen {len(user_assets)} jármű található a felhasználóhoz.")
        
        if not user_assets:
            print("   ℹ️  Nincsenek járművek a felhasználóhoz. Nincs mit felosztani.")
            return
        
        # 4. Járművek felosztása privát és céges között
        print("\n4. JÁRMŰVEK FELOSZTÁSA PRIVÁT ÉS CÉGES FLOTTA KÖZÖTT...")
        
        # Számoljuk meg, hány jármű van már privát és hány céges
        private_count = 0
        corporate_count = 0
        
        for asset in user_assets:
            if asset.owner_org_id is None:
                private_count += 1
            else:
                corporate_count += 1
        
        print(f"   Jelenlegi állapot: {private_count} privát, {corporate_count} céges jármű")
        
        # Ha minden jármű ugyanabban a kategóriában van, felosztjuk őket
        if private_count == 0 or corporate_count == 0:
            print("   ℹ️  Járművek újraelosztása 50-50% arányban...")
            
            # Felosztás fele-fele arányban
            half_index = len(user_assets) // 2
            
            for i, asset in enumerate(user_assets):
                if i < half_index:
                    # Első fele: maradjon privát (owner_org_id = None)
                    if asset.owner_org_id is not None:
                        asset.owner_org_id = None
                        print(f"      🚗 {asset.id}: Privát módra állítva")
                else:
                    # Második fele: legyen céges (owner_org_id = target_org.id)
                    if asset.owner_org_id != target_org.id:
                        asset.owner_org_id = target_org.id
                        print(f"      🏢 {asset.id}: Céges flottához rendelve (Szervezet: {target_org.name})")
            
            await db.commit()
            print(f"   ✅ {half_index} jármű privát, {len(user_assets) - half_index} jármű céges módra állítva.")
        else:
            print("   ✅ A járművek már megfelelően fel vannak osztva. Nincs szükség módosításra.")
        
        # 5. Végeredmény összefoglaló
        print("\n" + "=" * 60)
        print("VÉGEREDMÉNY ÖSSZEFOGLALÓ")
        print("=" * 60)
        
        # Új lekérdezés a frissített adatokhoz
        asset_result = await db.execute(asset_stmt)
        user_assets = asset_result.scalars().all()
        
        private_assets = [a for a in user_assets if a.owner_org_id is None]
        corporate_assets = [a for a in user_assets if a.owner_org_id == target_org.id]
        other_assets = [a for a in user_assets if a.owner_org_id not in [None, target_org.id]]
        
        print(f"\n📊 TESZT FELHASZNÁLÓ ÁLLAPOTA:")
        print(f"   • Email: {test_user.email}")
        print(f"   • User ID: {test_user.id}")
        print(f"   • Aktív szervezet: {target_org.name} (ID: {target_org.id})")
        print(f"   • Szerepkör a szervezetben: ADMIN")
        
        print(f"\n🚗 JÁRMŰVEGYÜTT ÁLLAPOTA:")
        print(f"   • Összes jármű: {len(user_assets)} db")
        print(f"   • Privát garázs (owner_org_id = NULL): {len(private_assets)} db")
        print(f"   • Céges flotta ({target_org.name}): {len(corporate_assets)} db")
        
        if other_assets:
            print(f"   • Egyéb szervezetekhez rendelve: {len(other_assets)} db")
        
        print(f"\n📋 PRIVÁT JÁRMŰVEK:")
        for asset in private_assets[:5]:  # Csak az első 5-öt mutatjuk
            catalog_name = asset.catalog.make + " " + asset.catalog.model if asset.catalog else "Ismeretlen"
            print(f"   • {catalog_name} (Asset ID: {asset.id})")
        
        if len(private_assets) > 5:
            print(f"   • ... és még {len(private_assets) - 5} további")
        
        print(f"\n🏢 CÉGES JÁRMŰVEK:")
        for asset in corporate_assets[:5]:
            catalog_name = asset.catalog.make + " " + asset.catalog.model if asset.catalog else "Ismeretlen"
            print(f"   • {catalog_name} (Asset ID: {asset.id})")
        
        if len(corporate_assets) > 5:
            print(f"   • ... és még {len(corporate_assets) - 5} további")
        
        print("\n" + "=" * 60)
        print("A tesztadatok sikeresen előkészítve!")
        print("Most tesztelhető a Garage UI switcher funkció.")
        print("=" * 60)

if __name__ == "__main__":
    asyncio.run(main())