import click
from flask import Flask
from flask_login import LoginManager
from sqlalchemy import text
from config import Config
from database import db, init_db
from oauth import init_oauth

login_manager = LoginManager()
login_manager.login_view = "main.login"


def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)

    init_db(app)
    init_oauth(app)

    from models.user import User  # noqa: F401 — registers model with SQLAlchemy metadata
    from models.role import Role  # noqa: F401
    from models.user_role import UserRole  # noqa: F401
    from models.project import Project  # noqa: F401
    from models.user_project import UserProject  # noqa: F401
    from models.issue import Issue  # noqa: F401
    from models.project_issue import ProjectIssue  # noqa: F401
    from models.sunrise_walk_config import SunriseWalkConfig  # noqa: F401

    login_manager.init_app(app)

    @login_manager.user_loader
    def load_user(user_id):
        return db.session.get(User, int(user_id))

    from routes.health import blueprint as health_bp
    app.register_blueprint(health_bp)

    from routes.main import blueprint as main_bp
    app.register_blueprint(main_bp)

    from routes.auth import blueprint as auth_bp
    app.register_blueprint(auth_bp)

    from routes.issues import blueprint as issues_bp
    app.register_blueprint(issues_bp)

    from routes.personal import blueprint as personal_bp
    app.register_blueprint(personal_bp)

    @app.cli.command("create-db")
    def create_db_command():
        db.create_all()
        _seed_roles = [
            "owner", "manager", "developer", "tester", "support", "deployer",
        ]
        for name in _seed_roles:
            if not Role.query.filter_by(name=name).first():
                db.session.add(Role(name=name))
        if not Project.query.filter_by(name="DAROS-PDV").first():
            db.session.add(Project(name="DAROS-PDV"))
        db.session.commit()
        click.echo("Database created and roles/projects seeded.")

    @app.cli.command("project-reset")
    @click.confirmation_option(
        prompt="Isto apaga TODAS as issues e vínculos. Continuar?"
    )
    def project_reset_command():
        """Zera as tabelas issues e project_issues e reseta o autoincrement de issues."""
        # project_issues primeiro (FK -> issues.id)
        db.session.execute(ProjectIssue.__table__.delete())
        db.session.execute(Issue.__table__.delete())

        dialect = db.engine.dialect.name
        if dialect == "mysql":
            db.session.execute(text("ALTER TABLE issues AUTO_INCREMENT = 1"))
        elif dialect == "sqlite":
            # sqlite_sequence só existe se alguma tabela usar AUTOINCREMENT;
            # sem ela, o id já reinicia em 1 com a tabela vazia.
            has_seq = db.session.execute(
                text(
                    "SELECT name FROM sqlite_master "
                    "WHERE type='table' AND name='sqlite_sequence'"
                )
            ).first()
            if has_seq:
                db.session.execute(
                    text("DELETE FROM sqlite_sequence WHERE name = 'issues'")
                )

        db.session.commit()
        click.echo("Issues e project_issues zeradas; id de issues reiniciado.")

    @app.cli.command("email-teste")
    @click.argument("recipient", default="ricardobianchin@gmail.com")
    def email_teste_command(recipient):
        """Envia um e-mail de teste com a formatação das notificações de ticket."""
        from services.email_service import send_test_email
        send_test_email(recipient)
        click.echo(f"E-mail de teste enviado para {recipient}.")

    return app
