from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import func
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os
from app.core import config
from sqlalchemy.orm import Session
from contextlib import contextmanager
from contextlib import asynccontextmanager

#DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"

db_user = config.DB_USER
db_password = config.DB_PASSWORD
db_host = config.DB_HOST
db_port = config.DB_PORT
db_name = config.DB_NAME

DATABASE_URL = f"postgresql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()


def get_engine():
    return create_engine(DATABASE_URL)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
@asynccontextmanager       
async def get_db_session_async():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@contextmanager
def get_db_new():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
           
@contextmanager
def get_session(engine):
    session = Session(bind=engine)
    try:
        yield session
        session.commit()  # Confirma la transacción al final
    except:
        session.rollback()  # Si hay un error, revierte la transacción
        raise
    finally:
        session.close()  # Asegúrate de cerrar la sesión al final     
        
"""
class Item(Base):
     __tablename__ = "items"

     id = Column(Integer, primary_key=True, index=True)
     name = Column(String, index=True)
     description = Column(String)
     created_at = Column(DateTime(timezone=True), server_default=func.now())

def init_db():
     Base.metadata.create_all(bind=engine)
"""