import sys
import signal
from flask import Flask

from app.core.database.pool import init_db, init_db_pool, close_connection_pool
from app.core.config import settings
from app.core.extensions import mail, cors
from app.api.items import item_routes
from app.api.images import image_routes
from app.api.hub.layout import hub_layout_routes
from app.api.hub.login import hub_login_routes
from app.api.hub.users import hub_users_routes
from app.api.leads import lead_routes
from app.api.new_apartments import new_apartment_routes


# Define Flask application
app = Flask(__name__)


# Initialize DB on startup
with app.app_context():
    # Initialize your DB connection pool (called only once when the app starts)
    init_db_pool()

    # Initialize DB on the first request
    init_db()


# Register shutdown function
def graceful_shutdown(*args):
    print("App shutting down... closing DB pool.")
    close_connection_pool()
    sys.exit(0)


# Handle Ctrl+C and SIGTERM shut downs (used by Docker, etc.)
signal.signal(signal.SIGINT, graceful_shutdown)
signal.signal(signal.SIGTERM, graceful_shutdown)


# Convert Pydantic settings into Flask config dict
app.config.update(
    MAIL_SERVER=settings.MAIL_SERVER,
    MAIL_PORT=settings.MAIL_PORT,
    MAIL_USE_SSL=settings.MAIL_USE_SSL,
    MAIL_USE_TLS=settings.MAIL_USE_TLS,
    MAIL_USERNAME=settings.MAIL_USERNAME,
    MAIL_PASSWORD=settings.MAIL_PASSWORD,
    MAIL_DEFAULT_SENDER=settings.MAIL_DEFAULT_SENDER,
)


mail.init_app(app)
cors.init_app(app)


# Register blueprints
app.register_blueprint(item_routes)
app.register_blueprint(image_routes)
app.register_blueprint(hub_layout_routes)
app.register_blueprint(hub_login_routes)
app.register_blueprint(hub_users_routes)
app.register_blueprint(lead_routes)
app.register_blueprint(new_apartment_routes)


# Index route
@app.route('/')
def index():
    return {"Hello": "world"}


# Main
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)
