#!/usr/bin/env python
"""
Script de inicialización para el Sistema de Gestión de Documentos ARCH.
Crea la estructura inicial de directorios y archivos necesarios.
"""

import os
import json
import bcrypt
from datetime import datetime
import pytz

def main():
    """Función principal de inicialización."""
    print("Inicializando Sistema de Gestión de Documentos ARCH...")
    
    # Crear estructura de directorios
    print("Creando estructura de directorios...")
    create_directory_structure()
    
    # Inicializar archivos JSON
    print("Inicializando archivos de datos...")
    initialize_json_files()
    
    print("\nSistema inicializado correctamente!")
    print("\nPuede iniciar la aplicación con el comando:")
    print("    flask run")
    print("\nCredenciales de acceso por defecto:")
    print("    Usuario: admin")
    print("    Contraseña: admin123")
    print("\nNOTA: Cambie la contraseña después del primer inicio de sesión.")

def create_directory_structure():
    """Crear la estructura de directorios necesaria."""
    # Directorios principales
    dirs = [
        'storage',
        'storage/logs',
        'storage/schemas',
        'storage/users',
        'storage/filetypes',
        'storage/projects',
    ]
    
    for directory in dirs:
        os.makedirs(directory, exist_ok=True)
        print(f"  Creado: {directory}")

def initialize_json_files():
    """Inicializar archivos JSON con datos por defecto."""
    # Índices
    indices = {
        "max_project_id": 0,
        "max_document_id": 0
    }
    save_json('storage/indices.json', indices)
    
    # Usuarios
    admin_password = bcrypt.hashpw("admin123".encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
    users = {
        "admin": {
            "nombre": "Administrador",
            "username": "admin",
            "email": "admin@ejemplo.com",
            "password_hash": admin_password,
            "nivel": 9999,
            "idioma": "es",
            "fecha_caducidad": None,
            "empresa": "ARCH",
            "estado": "activo",
            "ultimo_acceso": datetime.now(pytz.UTC).isoformat()
        }
    }
    save_json('storage/users/users.json', users)
    
    # Tipos de archivo
    filetypes = {
        "pdf": {
            "extension": "pdf",
            "descripcion": "Documento PDF",
            "mime_type": "application/pdf",
            "tamano_maximo": 20971520  # 20MB
        },
        "txt": {
            "extension": "txt",
            "descripcion": "Documento de texto",
            "mime_type": "text/plain",
            "tamano_maximo": 5242880  # 5MB
        },
        "zip": {
            "extension": "zip",
            "descripcion": "Archivo comprimido",
            "mime_type": "application/zip",
            "tamano_maximo": 104857600  # 100MB
        },
        "docx": {
            "extension": "docx",
            "descripcion": "Documento Word",
            "mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
            "tamano_maximo": 20971520  # 20MB
        },
        "xlsx": {
            "extension": "xlsx",
            "descripcion": "Hoja de cálculo Excel",
            "mime_type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "tamano_maximo": 20971520  # 20MB
        },
        "dwg": {
            "extension": "dwg",
            "descripcion": "Dibujo AutoCAD",
            "mime_type": "application/acad",
            "tamano_maximo": 52428800  # 50MB
        }
    }
    save_json('storage/filetypes/filetypes.json', filetypes)
    
    # Esquemas
    schemas = {
        "ESQ001": {
            "codigo": "ESQ001",
            "descripcion": "Proyecto estándar",
            "fecha_creacion": datetime.now(pytz.UTC).isoformat(),
            "creado_por": "admin",
            "documentos": [
                {
                    "tipo": "pdf",
                    "nombre": "Manual de Usuario",
                    "nivel_ver": 0,
                    "nivel_editar": 5000
                },
                {
                    "tipo": "dwg",
                    "nombre": "Planos Técnicos",
                    "nivel_ver": 0,
                    "nivel_editar": 5000
                },
                {
                    "tipo": "zip",
                    "nombre": "Archivos Fuente",
                    "nivel_ver": 1000,
                    "nivel_editar": 5000
                },
                {
                    "tipo": "xlsx",
                    "nombre": "Datos y Cálculos",
                    "nivel_ver": 0,
                    "nivel_editar": 1000
                }
            ]
        },
        "ESQ002": {
            "codigo": "ESQ002",
            "descripcion": "Documentación técnica",
            "fecha_creacion": datetime.now(pytz.UTC).isoformat(),
            "creado_por": "admin",
            "documentos": [
                {
                    "tipo": "pdf",
                    "nombre": "Especificaciones Técnicas",
                    "nivel_ver": 0,
                    "nivel_editar": 5000
                },
                {
                    "tipo": "pdf",
                    "nombre": "Manual de Mantenimiento",
                    "nivel_ver": 0,
                    "nivel_editar": 5000
                },
                {
                    "tipo": "pdf",
                    "nombre": "Certificaciones",
                    "nivel_ver": 0,
                    "nivel_editar": 9000
                }
            ]
        }
    }
    save_json('storage/schemas/schema.json', schemas)

def save_json(file_path, data):
    """Guardar datos en archivo JSON con formato."""
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print(f"  Inicializado: {file_path}")

if __name__ == '__main__':
    main()