import asyncio
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy import update
import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from database import AsyncSessionLocal, engine
from models import User, Role, Company, Project, Team, Ticket, SystemSetting, KbArticle, TicketAutomation
from auth import get_password_hash

async def setup_jampuero():
    # 0. Crear todas las tablas si no existen
    from database import Base
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    print("Tablas verificadas/creadas con éxito en MySQL.")

    async with AsyncSessionLocal() as db:
        # 1. Crear empresa PRUEBA por defecto si no existe
        stmt_comp = select(Company).where(Company.name == "PRUEBA")

        result_comp = await db.execute(stmt_comp)
        company = result_comp.scalar_one_or_none()
        
        if not company:
            company = Company(name="PRUEBA", is_active=True)
            db.add(company)
            await db.commit()
            await db.refresh(company)
            print("Empresa 'PRUEBA' creada.")

        # 2. Roles
        roles_to_create = ["Super Administrador", "Administrador", "Visualizador"]
        role_objs = {}
        for rname in roles_to_create:
            stmt = select(Role).where(Role.name == rname)
            result = await db.execute(stmt)
            role = result.scalar_one_or_none()
            if not role:
                role = Role(name=rname, description=f"Rol de {rname}")
                db.add(role)
                await db.commit()
                await db.refresh(role)
            role_objs[rname] = role

        # 3. Usuario jampuero (como Super Administrador)
        stmt_u = select(User).where(User.username == "jampuero")
        result_u = await db.execute(stmt_u)
        user = result_u.scalar_one_or_none()
        
        if user:
            print("El usuario 'jampuero' ya existe.")
            user.hashed_password = get_password_hash("jampuero")
            if not any(r.name == "Super Administrador" for r in user.roles):
                user.roles.append(role_objs["Super Administrador"])
            await db.commit()
            print("Se actualizaron los permisos y contraseña del usuario existente (Super Administrador).")
        else:
            hashed_password = get_password_hash("jampuero")
            new_user = User(
                username="jampuero",
                email="jampuero@ejemplo.com",
                hashed_password=hashed_password,
                is_active=True,
                company_id=None # Super Admins don't strictly need a company
            )
            db.add(new_user)
            await db.commit()
            await db.refresh(new_user)
            new_user.roles.append(role_objs["Super Administrador"])
            await db.commit()
            print("¡Usuario web 'jampuero' creado exitosamente como Super Administrador!")

        # 4. Migrar todos los registros existentes a la empresa PRUEBA
        print("Migrando datos existentes a la empresa PRUEBA...")
        await db.execute(update(User).where(User.company_id == None).values(company_id=company.id))
        await db.execute(update(Project).where(Project.company_id == None).values(company_id=company.id))
        await db.execute(update(Team).where(Team.company_id == None).values(company_id=company.id))
        await db.execute(update(Ticket).where(Ticket.company_id == None).values(company_id=company.id))
        await db.execute(update(SystemSetting).where(SystemSetting.company_id == None).values(company_id=company.id))
        await db.execute(update(KbArticle).where(KbArticle.company_id == None).values(company_id=company.id))
        await db.execute(update(TicketAutomation).where(TicketAutomation.company_id == None).values(company_id=company.id))
        await db.commit()
        print("Migración de datos completada.")

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