"""
LicenciasMiG - panel web dedicado a aprobacion de solicitudes de licencia MIG.

Rutas servidas:
  GET  /login
  POST /login                              -> autenticar admin
  GET  /                                   -> lista de solicitudes
  GET  /solicitud/<id>                     -> detalle
  POST /solicitud/<id>/aprobar             -> aprobar (inserta en LicenciasEmpresas)
  POST /solicitud/<id>/rechazar            -> rechazar con motivo
  GET  /api/pendientes/count               -> JSON {pendientes: N}
  ANY  /SolicitudesService.asmx[?wsdl]     -> SOAP consumido por el cliente MIG
  GET  /health                             -> liveness
  GET  /init-db                            -> bootstrap unica vez

Se conecta a la BD compartida con el panel viejo (LicenciasMIG).
"""
from __future__ import annotations

from datetime import datetime, timedelta

from flask import Flask, jsonify, redirect, render_template, request, url_for
from flask_cors import CORS
from flask_login import LoginManager, current_user

from config import Config
from models import Usuario, db
from routes.auth import bp as auth_bp
from routes.solicitudes import bp as solicitudes_bp
from soap_service import register_soap


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

    # ----- Init -----
    CORS(app, supports_credentials=True)
    db.init_app(app)

    login_manager = LoginManager()
    login_manager.init_app(app)
    login_manager.login_view = 'auth.login_page'

    @login_manager.user_loader
    def load_user(user_id):
        try:
            return Usuario.query.get(int(user_id))
        except (TypeError, ValueError):
            return None

    @login_manager.unauthorized_handler
    def unauthorized():
        if request.path.startswith('/api/'):
            return jsonify(ok=False, error='No autenticado'), 401
        return redirect(url_for('auth.login_page', next=request.path))

    # ----- Blueprints -----
    app.register_blueprint(auth_bp)
    app.register_blueprint(solicitudes_bp)

    # ----- SOAP para cliente MIG -----
    register_soap(app)

    # ----- Inyectar usuario al template -----
    @app.context_processor
    def inject_user():
        return {'current_user': current_user}

    # ----- Health -----
    @app.route('/health')
    def health():
        return jsonify(ok=True, ts=datetime.utcnow().isoformat() + 'Z')

    return app


app = create_app()


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=Config.PORT, debug=Config.DEBUG)
