#!/usr/bin/env python3
"""
Inicializa o banco MySQL em uma máquina nova.

Uso:
  python scripts/init_database.py
  python scripts/init_database.py --criar-banco
  python scripts/init_database.py --status
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from dotenv import load_dotenv

BASE_DIR = Path(__file__).resolve().parent.parent
if str(BASE_DIR) not in sys.path:
    sys.path.insert(0, str(BASE_DIR))

load_dotenv(BASE_DIR / ".env")

from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL

from app.db import ENGINE, init_db, storage_usa_banco
from app.migrations import run_migrations, status_migrations
from app.settings import (
    APP_STORAGE_BACKEND,
    MYSQL_DATABASE,
    MYSQL_HOST,
    MYSQL_PASSWORD,
    MYSQL_PORT,
    MYSQL_USER,
)


def _url_sem_database() -> str:
    return URL.create(
        drivername="mysql+pymysql",
        username=MYSQL_USER,
        password=MYSQL_PASSWORD,
        host=MYSQL_HOST,
        port=MYSQL_PORT,
        query={"charset": "utf8mb4"},
    ).render_as_string(hide_password=False)


def criar_banco_se_necessario() -> None:
    engine_admin = create_engine(_url_sem_database(), pool_pre_ping=True)
    with engine_admin.begin() as conn:
        conn.execute(
            text(
                f"CREATE DATABASE IF NOT EXISTS `{MYSQL_DATABASE}` "
                "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
            )
        )
    print(f"[OK] Banco `{MYSQL_DATABASE}` verificado/criado em {MYSQL_HOST}:{MYSQL_PORT}")


def main() -> int:
    parser = argparse.ArgumentParser(description="Inicializa schema MySQL do OMRCheck-Web")
    parser.add_argument(
        "--criar-banco",
        action="store_true",
        help="Cria o database MySQL se ainda não existir",
    )
    parser.add_argument(
        "--status",
        action="store_true",
        help="Mostra migrations aplicadas e pendentes",
    )
    args = parser.parse_args()

    if not storage_usa_banco():
        print(
            f"[INFO] APP_STORAGE_BACKEND={APP_STORAGE_BACKEND!r} — "
            "banco MySQL não está habilitado. Jobs/Kanban usam arquivos em runtime/."
        )
        return 0

    if args.criar_banco:
        criar_banco_se_necessario()

    if ENGINE is None:
        print("[ERRO] Não foi possível conectar ao MySQL. Verifique MYSQL_* no .env")
        return 1

    try:
        with ENGINE.connect() as conn:
            conn.execute(text("SELECT 1"))
    except Exception as erro:
        print(f"[ERRO] Falha ao conectar: {erro}")
        print("Dica: rode com --criar-banco ou crie o database manualmente no MySQL.")
        return 1

    if args.status:
        info = status_migrations(ENGINE)
        print(f"Backend: {info['backend']}")
        print(f"Migrations aplicadas ({len(info['aplicadas'])}/{info['total']}): {', '.join(info['aplicadas']) or '—'}")
        if info["pendentes"]:
            print(f"Pendentes: {', '.join(info['pendentes'])}")
        else:
            print("Nenhuma migration pendente.")
        return 0

    executadas = run_migrations(ENGINE, verbose=True)
    if executadas:
        print(f"[OK] {len(executadas)} migration(s) aplicada(s): {', '.join(executadas)}")
    else:
        print("[OK] Schema já estava atualizado.")

    init_db()
    print("[OK] Banco pronto para uso.")
    print("")
    print("Importante: os dados (cards do Kanban, jobs, sessões) NÃO vêm com o código.")
    print("Na máquina de origem:  python scripts/pacote_migracao.py exportar")
    print("Na máquina nova:      python scripts/pacote_migracao.py importar --arquivo backups\\omrcheck_migracao_....zip")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
