#!/usr/bin/env python3
"""
Script de Inicialización / Limpieza de Base de Datos - IoPlay DCM
============================================================================
Permite limpiar o recrear la base de datos SQLite (facturas_index.db) y dejarla
completamente lista para indexar desde cero.

Uso:
  python reset_db.py                   # Limpia la base de datos (pide confirmación)
  python reset_db.py --force           # Limpia sin pedir confirmación (para scripts/cron)
  python reset_db.py --reindex         # Limpia e inicia la indexación inmediatamente
  python reset_db.py --force --reindex # Modo desatendido completo
  python reset_db.py --schema          # Recrea el esquema de tablas desde cero
"""

import sys
import os
import argparse
import time

# Asegurar que el directorio actual esté en sys.path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

import db
import indexer

def get_db_file_size() -> str:
    """Retorna el tamaño formateado del archivo de base de datos"""
    if os.path.exists(db.DB_PATH):
        size_bytes = os.path.getsize(db.DB_PATH)
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size_bytes < 1024.0:
                return f"{size_bytes:.2f} {unit}"
            size_bytes /= 1024.0
        return f"{size_bytes:.2f} TB"
    return "0 B (Archivo aún no creado)"

def print_banner():
    print("=" * 70)
    print("   IoPlay DCM - Inicializador / Limpiador de BDD")
    print("=" * 70)

def main():
    parser = argparse.ArgumentParser(
        description="Inicializa o reinicia la base de datos de facturas para comenzar una indexación limpia."
    )
    parser.add_argument(
        "-f", "--force",
        action="store_true",
        help="Omite la confirmación interactiva (ideal para scripts de despliegue y automatizaciones)."
    )
    parser.add_argument(
        "-r", "--reindex",
        action="store_true",
        help="Inicia inmediatamente el proceso de escaneo e indexación tras limpiar la base de datos."
    )
    parser.add_argument(
        "-s", "--schema",
        action="store_true",
        help="Recrea completamente las tablas e índices (DROP + CREATE TABLE) en vez de solo borrar datos."
    )
    parser.add_argument(
        "-v", "--vacuum",
        action="store_true",
        help="Ejecuta VACUUM sobre SQLite para compactar y liberar espacio en disco."
    )

    args = parser.parse_args()
    print_banner()

    print(f"[*] Ruta de la Base de Datos : {os.path.abspath(db.DB_PATH)}")
    print(f"[*] Tamaño actual en disco   : {get_db_file_size()}")

    # Obtener estadísticas actuales
    try:
        current_stats = db.get_stats()
        print(f"[*] Total facturas actuales  : {current_stats.get('total_invoices', 0):,}")
        print(f"[*] Suscriptores únicos      : {current_stats.get('unique_customers', 0):,}")
        print(f"[*] Último escaneo registrado: {current_stats.get('last_scan_time', 'Ninguno')}")
    except Exception as e:
        print(f"[*] Estado BDD               : No inicializada o vacía ({e})")

    print("-" * 70)

    # Confirmación si no está en modo force
    if not args.force:
        print("\nADVERTENCIA: Esta acción borrará todos los registros indexados de facturas.")
        confirm = input("¿Estás seguro de que deseas reiniciar la base de datos? (s/N): ").strip().lower()
        if confirm not in ("s", "si", "y", "yes"):
            print("\n[!] Operación cancelada por el usuario.")
            sys.exit(0)

    print("\n[+] Reiniciando base de datos...")
    start_time = time.time()

    try:
        if args.schema:
            print("[+] Recreando esquema completo (DROP + CREATE TABLE)...")
            db.reset_db_schema()
        else:
            print("[+] Limpiando registros existentes (TRUNCATE/DELETE + VACUUM)...")
            db.clear_db()

        # Si se solicitó recrear estructura básica
        db.init_db()

        elapsed = round(time.time() - start_time, 3)
        new_stats = db.get_stats()

        print(f"[✓] Base de datos inicializada exitosamente en {elapsed}s.")
        print(f"[*] Registros actuales: {new_stats.get('total_invoices', 0)} facturas.")
        print(f"[*] Nuevo tamaño en disco: {get_db_file_size()}")

    except Exception as e:
        print(f"\n[ERROR] Ocurrió un error al reiniciar la base de datos: {e}")
        sys.exit(1)

    # Si se solicita reindexar inmediatamente
    if args.reindex:
        print("\n" + "=" * 70)
        print("   Iniciando Indexación Completa de Almacenamiento...")
        print("=" * 70)
        
        storage_paths = indexer.get_configured_storage_paths()
        print(f"[*] Carpetas a escanear ({len(storage_paths)}):")
        for idx, p in enumerate(storage_paths, start=1):
            exists_str = "EXISTE" if os.path.exists(p) else "NO ENCONTRADA"
            print(f"    {idx}. {p} [{exists_str}]")

        print("\n[+] Escaneando archivos...")
        scan_result = indexer.scan_storage_directory(storage_paths)

        print("\n" + "-" * 70)
        print("   Resumen de Indexación:")
        print(f"   - Archivos escaneados : {scan_result.get('scanned', 0):,}")
        print(f"   - Facturas indexadas  : {scan_result.get('added_or_updated', 0):,}")
        print(f"   - Tiempo total        : {scan_result.get('elapsed_seconds', 0)} s")
        
        final_stats = db.get_stats()
        print(f"   - Total en BDD        : {final_stats.get('total_invoices', 0):,} facturas")
        print(f"   - Suscriptores únicos : {final_stats.get('unique_customers', 0):,}")
        print(f"   - Tamaño BDD final    : {get_db_file_size()}")
        print("=" * 70)

    print("\n[✓] Listo. La base de datos está preparada y operativa.\n")

if __name__ == "__main__":
    main()
