#!/usr/bin/env python3
"""
Script para generar el cuadro comparativo de Investigación Aplicada Semana 2
como documento Word (.docx) nativo con diseño moderno y profesional.
Autor: Generado para Alexander Oviedo Fadul
"""

from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import os

# Colores corporativos
AZUL_OSCURO = RGBColor(0x1B, 0x3A, 0x5C)
AZUL_MEDIO = RGBColor(0x2C, 0x5F, 0x8A)
AZUL_CLARO = RGBColor(0xD6, 0xE8, 0xF7)
GRIS_CLARO = RGBColor(0xF2, 0xF2, 0xF2)
BLANCO = RGBColor(0xFF, 0xFF, 0xFF)
NEGRO = RGBColor(0x00, 0x00, 0x00)
GRIS_TEXTO = RGBColor(0x33, 0x33, 0x33)
VERDE_CUAL = RGBColor(0x27, 0x82, 0x55)
NARANJA_CUANT = RGBColor(0xD4, 0x6B, 0x08)


def set_cell_shading(cell, color_hex):
    """Aplica color de fondo a una celda."""
    shading_elm = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    cell._tc.get_or_add_tcPr().append(shading_elm)


def set_cell_borders(cell, color="1B3A5C", size="4"):
    """Aplica bordes a una celda."""
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = parse_xml(
        f'<w:tcBorders {nsdecls("w")}>'
        f'  <w:top w:val="single" w:sz="{size}" w:space="0" w:color="{color}"/>'
        f'  <w:left w:val="single" w:sz="{size}" w:space="0" w:color="{color}"/>'
        f'  <w:bottom w:val="single" w:sz="{size}" w:space="0" w:color="{color}"/>'
        f'  <w:right w:val="single" w:sz="{size}" w:space="0" w:color="{color}"/>'
        f'</w:tcBorders>'
    )
    tcPr.append(tcBorders)


def set_cell_vertical_alignment(cell, align="center"):
    """Alinea verticalmente el contenido de la celda."""
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    val_map = {"center": "center", "top": "top", "bottom": "bottom"}
    vAlign = parse_xml(f'<w:vAlign {nsdecls("w")} w:val="{val_map.get(align, "center")}"/>')
    tcPr.append(vAlign)


def add_formatted_paragraph(cell, text, bold=False, font_size=10, color=GRIS_TEXTO,
                            alignment=WD_ALIGN_PARAGRAPH.LEFT, font_name="Calibri",
                            space_after=Pt(4)):
    """Agrega un párrafo formateado a una celda."""
    p = cell.paragraphs[0] if cell.paragraphs and cell.paragraphs[0].text == "" else cell.add_paragraph()
    run = p.add_run(text)
    run.font.size = Pt(font_size)
    run.font.color.rgb = color
    run.font.bold = bold
    run.font.name = font_name
    p.alignment = alignment
    p.paragraph_format.space_after = space_after
    p.paragraph_format.space_before = Pt(2)
    return p


def add_multi_content_cell(cell, items, font_size=10, color=GRIS_TEXTO):
    """Agrega múltiples ítems a una celda, cada uno como párrafo."""
    # Limpiar contenido previo
    for p in cell.paragraphs:
        if p.text == "":
            continue
    
    first = True
    for item in items:
        if first:
            p = cell.paragraphs[0]
            first = False
        else:
            p = cell.add_paragraph()
        
        if isinstance(item, dict):
            run = p.add_run(item.get("bold_text", ""))
            run.font.bold = True
            run.font.size = Pt(font_size)
            run.font.color.rgb = color
            run.font.name = "Calibri"
            
            if "text" in item:
                run2 = p.add_run(item["text"])
                run2.font.size = Pt(font_size)
                run2.font.color.rgb = color
                run2.font.name = "Calibri"
        else:
            run = p.add_run(item)
            run.font.size = Pt(font_size)
            run.font.color.rgb = color
            run.font.name = "Calibri"
        
        p.paragraph_format.space_after = Pt(3)
        p.paragraph_format.space_before = Pt(3)


def create_document():
    doc = Document()
    
    # Configurar márgenes
    for section in doc.sections:
        section.top_margin = Cm(2.54)
        section.bottom_margin = Cm(2.54)
        section.left_margin = Cm(2.54)
        section.right_margin = Cm(2.54)
    
    # Estilo por defecto
    style = doc.styles['Normal']
    font = style.font
    font.name = 'Calibri'
    font.size = Pt(11)
    font.color.rgb = GRIS_TEXTO
    
    # ===== PORTADA =====
    # Espaciado superior
    for _ in range(3):
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(0)
    
    # Línea decorativa superior
    p = doc.add_paragraph()
    run = p.add_run("━" * 50)
    run.font.color.rgb = AZUL_MEDIO
    run.font.size = Pt(14)
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # Título principal
    p = doc.add_paragraph()
    run = p.add_run("CUADRO COMPARATIVO")
    run.font.size = Pt(28)
    run.font.color.rgb = AZUL_OSCURO
    run.font.bold = True
    run.font.name = "Calibri Light"
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = Pt(4)
    
    # Subtítulo
    p = doc.add_paragraph()
    run = p.add_run("Método Científico y Enfoques de Investigación")
    run.font.size = Pt(16)
    run.font.color.rgb = AZUL_MEDIO
    run.font.name = "Calibri"
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = Pt(8)
    
    # Línea decorativa inferior
    p = doc.add_paragraph()
    run = p.add_run("━" * 50)
    run.font.color.rgb = AZUL_MEDIO
    run.font.size = Pt(14)
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = Pt(40)
    
    # Datos del estudiante
    datos = [
        ("Estudiante:", "Alexander Oviedo Fadul"),
        ("Curso:", "NRC-199 – Investigación Aplicada"),
        ("Docente:", "Fanny E. Sacristán"),
        ("Semana:", "2"),
        ("Fecha:", "Marzo de 2026"),
    ]
    
    for label, value in datos:
        p = doc.add_paragraph()
        run_label = p.add_run(label + " ")
        run_label.font.bold = True
        run_label.font.size = Pt(12)
        run_label.font.color.rgb = AZUL_OSCURO
        run_label.font.name = "Calibri"
        
        run_value = p.add_run(value)
        run_value.font.size = Pt(12)
        run_value.font.color.rgb = GRIS_TEXTO
        run_value.font.name = "Calibri"
        
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.paragraph_format.space_after = Pt(2)
    
    # Salto de página
    doc.add_page_break()
    
    # ===== PARTE 1: MÉTODO CIENTÍFICO =====
    # Título de sección
    p = doc.add_paragraph()
    run = p.add_run("PARTE 1: MÉTODO CIENTÍFICO")
    run.font.size = Pt(16)
    run.font.color.rgb = AZUL_OSCURO
    run.font.bold = True
    run.font.name = "Calibri"
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p.paragraph_format.space_after = Pt(12)
    
    # Tabla del Método Científico
    table1 = doc.add_table(rows=3, cols=2)
    table1.alignment = WD_TABLE_ALIGNMENT.CENTER
    
    # Encabezado
    header_cells = table1.rows[0].cells
    header_cells[0].merge(header_cells[1])
    set_cell_shading(header_cells[0], "1B3A5C")
    set_cell_borders(header_cells[0], "1B3A5C", "6")
    add_formatted_paragraph(header_cells[0], "MÉTODO CIENTÍFICO METODOLÓGICO",
                          bold=True, font_size=13, color=BLANCO,
                          alignment=WD_ALIGN_PARAGRAPH.CENTER)
    
    # Fila: ¿Qué es?
    row1 = table1.rows[1].cells
    set_cell_shading(row1[0], "2C5F8A")
    set_cell_borders(row1[0], "1B3A5C", "4")
    set_cell_borders(row1[1], "1B3A5C", "4")
    set_cell_vertical_alignment(row1[0])
    add_formatted_paragraph(row1[0], "¿Qué es?", bold=True, font_size=11, color=BLANCO,
                          alignment=WD_ALIGN_PARAGRAPH.CENTER)
    
    que_es_texto = (
        "El método científico es el procedimiento sistemático y ordenado que permite generar "
        "conocimiento objetivo mediante pasos estructurados: desde la observación de un fenómeno "
        "hasta la formulación de conclusiones respaldadas por evidencia empírica. No es un fin en "
        "sí mismo sino el medio para alcanzar explicaciones verificables y replicables de la realidad. "
        "Hernández-Sampieri y Mendoza (2018) lo describen como un proceso riguroso que combina "
        "lógica deductiva e inductiva para producir conocimiento con validez y confiabilidad. "
        "En la sesión de clase, la profesora Sacristán nos recordó cómo figuras como Francis Bacon, "
        "Galileo Galilei y Newton consolidaron las bases de este método al vincular la observación "
        "empírica con la matemática y la experimentación controlada."
    )
    set_cell_shading(row1[1], "F2F2F2")
    add_formatted_paragraph(row1[1], que_es_texto, font_size=10)
    
    # Fila: ¿Cuáles son sus componentes?
    row2 = table1.rows[2].cells
    set_cell_shading(row2[0], "2C5F8A")
    set_cell_borders(row2[0], "1B3A5C", "4")
    set_cell_borders(row2[1], "1B3A5C", "4")
    set_cell_vertical_alignment(row2[0])
    add_formatted_paragraph(row2[0], "¿Cuáles son\nsus componentes?", bold=True,
                          font_size=11, color=BLANCO,
                          alignment=WD_ALIGN_PARAGRAPH.CENTER)
    
    componentes = [
        {"bold_text": "1. Observación: ", "text": "Percepción directa del fenómeno que genera curiosidad investigativa. La profesora Sacristán lo ilustró con preguntarse por qué cae una manzana o por qué el atardecer tiene ciertos colores."},
        {"bold_text": "2. Formulación del problema: ", "text": "Delimitación precisa de qué se quiere investigar, acotando los límites y alcances de la pregunta de investigación."},
        {"bold_text": "3. Hipótesis: ", "text": "Respuesta tentativa al problema planteado. Hernández-Sampieri (2018) la define como una guía propositiva, medible y sujeta a validación experimental."},
        {"bold_text": "4. Experimentación / Metodología: ", "text": "Aplicación del diseño de investigación elegido (cuantitativo, cualitativo o mixto) para recopilar y procesar datos de manera controlada."},
        {"bold_text": "5. Análisis y conclusiones: ", "text": "Interpretación de resultados que confirman o refutan la hipótesis, generando nuevo conocimiento que a su vez abre nuevas preguntas e inicia un nuevo ciclo investigativo."},
    ]
    set_cell_shading(row2[1], "FFFFFF")
    add_multi_content_cell(row2[1], componentes, font_size=10)
    
    # Ajustar anchos de columna
    for row in table1.rows:
        row.cells[0].width = Cm(4)
        row.cells[1].width = Cm(13)
    
    # Espaciado
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(20)
    
    # ===== PARTE 2: ENFOQUES DE INVESTIGACIÓN =====
    p = doc.add_paragraph()
    run = p.add_run("PARTE 2: ENFOQUES DE INVESTIGACIÓN")
    run.font.size = Pt(16)
    run.font.color.rgb = AZUL_OSCURO
    run.font.bold = True
    run.font.name = "Calibri"
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p.paragraph_format.space_after = Pt(12)
    
    # Tabla de enfoques
    table2 = doc.add_table(rows=3, cols=4)
    table2.alignment = WD_TABLE_ALIGNMENT.CENTER
    
    # Encabezados
    headers = ["Enfoque", "Características", "Diferencias", "Instrumentos"]
    for i, header_text in enumerate(headers):
        cell = table2.rows[0].cells[i]
        set_cell_shading(cell, "1B3A5C")
        set_cell_borders(cell, "1B3A5C", "6")
        set_cell_vertical_alignment(cell)
        add_formatted_paragraph(cell, header_text, bold=True, font_size=11,
                              color=BLANCO, alignment=WD_ALIGN_PARAGRAPH.CENTER)
    
    # Fila Cualitativo
    cual_data = [
        "CUALITATIVO",
        (
            "Es inductivo, interpretativo y flexible. La recolección y análisis de datos "
            "ocurren de forma simultánea, y el diseño se ajusta conforme avanza la investigación. "
            "Busca comprender significados, experiencias y contextos humanos desde la perspectiva "
            "de los participantes, en su entorno natural. Sánchez Flores (2019) señala que este "
            "enfoque se nutre del constructivismo y la fenomenología para capturar la subjetividad "
            "de las vivencias y los procesos sociales."
        ),
        (
            "No busca medir ni generalizar resultados; su objetivo es profundizar en el "
            "\"por qué\" de los fenómenos. No trabaja con hipótesis rígidas al inicio sino que "
            "las construye durante el proceso. Su validez se sustenta en la riqueza interpretativa "
            "y la saturación de datos, no en la representatividad estadística. "
            "Mendizábal (2018) destaca que su flexibilidad permite descubrir categorías emergentes "
            "que un diseño cuantitativo no capturaría."
        ),
        (
            "Entrevistas a profundidad (estructuradas y no estructuradas), grupos focales, "
            "observación participante, historias de vida y relatos biográficos, análisis de "
            "documentos textuales, diarios de campo y bitácoras etnográficas."
        ),
    ]
    
    for i, content in enumerate(cual_data):
        cell = table2.rows[1].cells[i]
        set_cell_borders(cell, "1B3A5C", "4")
        if i == 0:
            set_cell_shading(cell, "278255")
            set_cell_vertical_alignment(cell)
            add_formatted_paragraph(cell, content, bold=True, font_size=11,
                                  color=BLANCO, alignment=WD_ALIGN_PARAGRAPH.CENTER)
        else:
            bg = "D6E8F7" if i % 2 == 1 else "F2F2F2"
            set_cell_shading(cell, bg)
            add_formatted_paragraph(cell, content, font_size=9.5)
    
    # Fila Cuantitativo
    cuant_data = [
        "CUANTITATIVO",
        (
            "Es deductivo, secuencial y estructurado. Parte de hipótesis previamente formuladas "
            "que se someten a prueba mediante recolección y análisis estadístico de datos numéricos. "
            "Busca objetividad, precisión y generalización de resultados. Hernández-Sampieri (2018) "
            "lo describe como un proceso lineal: idea → problema → hipótesis → diseño → "
            "recolección → análisis → resultados. La clase de la profesora Sacristán conectó este "
            "enfoque con la tradición positivista de Bacon y Newton."
        ),
        (
            "Depende de la estadística para establecer relaciones causales y correlaciones entre "
            "variables controladas. Trabaja con muestras representativas y los resultados pretenden "
            "ser generalizables a poblaciones más amplias. Su paradigma se alinea con el positivismo "
            "empírico. A diferencia del cualitativo, las hipótesis se definen antes de recoger datos "
            "y el investigador mantiene distancia del objeto de estudio para garantizar objetividad."
        ),
        (
            "Cuestionarios cerrados con opciones predefinidas, encuestas estandarizadas, escalas "
            "de medición validadas (como la escala Likert), pruebas experimentales controladas, "
            "bases de datos estadísticas, análisis de regresión, correlación e inferencia con "
            "muestras aleatorias numéricas."
        ),
    ]
    
    for i, content in enumerate(cuant_data):
        cell = table2.rows[2].cells[i]
        set_cell_borders(cell, "1B3A5C", "4")
        if i == 0:
            set_cell_shading(cell, "D46B08")
            set_cell_vertical_alignment(cell)
            add_formatted_paragraph(cell, content, bold=True, font_size=11,
                                  color=BLANCO, alignment=WD_ALIGN_PARAGRAPH.CENTER)
        else:
            bg = "F2F2F2" if i % 2 == 1 else "D6E8F7"
            set_cell_shading(cell, bg)
            add_formatted_paragraph(cell, content, font_size=9.5)
    
    # Ajustar anchos
    for row in table2.rows:
        row.cells[0].width = Cm(2.5)
        row.cells[1].width = Cm(5.5)
        row.cells[2].width = Cm(5.5)
        row.cells[3].width = Cm(4)
    
    # Espaciado
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(20)
    
    # ===== REFLEXIÓN PERSONAL =====
    p = doc.add_paragraph()
    run = p.add_run("REFLEXIÓN PERSONAL")
    run.font.size = Pt(14)
    run.font.color.rgb = AZUL_OSCURO
    run.font.bold = True
    run.font.name = "Calibri"
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p.paragraph_format.space_after = Pt(8)
    
    # Línea decorativa
    p = doc.add_paragraph()
    run = p.add_run("─" * 70)
    run.font.color.rgb = AZUL_CLARO
    run.font.size = Pt(8)
    p.paragraph_format.space_after = Pt(8)
    
    reflexion_texto = (
        "Lo que más me ha resultado interesante de esta semana es comprobar, desde la teoría, "
        "algo que ya intuía por la práctica profesional: los enfoques cuantitativo y cualitativo no son "
        "opuestos irreconciliables, sino complementarios. En mi experiencia con sistemas de información "
        "para el sector judicial, he visto cómo las estadísticas de gestión mostraban indicadores de "
        "eficiencia aparentemente buenos, pero cuando se conversaba con los funcionarios —cuando se hacía, "
        "digamos, un abordaje cualitativo informal— salían a la luz problemas operativos que los números "
        "simplemente no capturaban."
    )
    
    p = doc.add_paragraph()
    run = p.add_run(reflexion_texto)
    run.font.size = Pt(11)
    run.font.color.rgb = GRIS_TEXTO
    run.font.name = "Calibri"
    p.paragraph_format.space_after = Pt(8)
    p.paragraph_format.line_spacing = Pt(18)
    
    reflexion_texto2 = (
        "La profesora Sacristán enfatizó en clase algo que me pareció clave: la elección del enfoque "
        "no es una decisión caprichosa ni ideológica, sino que depende directamente del problema que se "
        "quiera resolver. Y como señala Mendizábal (2018), la combinación de ambas rutas en un enfoque "
        "mixto representa una madurez metodológica que aprovecha lo mejor de cada paradigma. En el campo "
        "de la inteligencia artificial, donde estamos cursando esta especialización, esa mixtura se vuelve "
        "particularmente relevante: los datos cuantitativos alimentan los modelos, pero la interpretación "
        "cualitativa del contexto es lo que les da sentido real."
    )
    
    p = doc.add_paragraph()
    run = p.add_run(reflexion_texto2)
    run.font.size = Pt(11)
    run.font.color.rgb = GRIS_TEXTO
    run.font.name = "Calibri"
    p.paragraph_format.space_after = Pt(16)
    p.paragraph_format.line_spacing = Pt(18)
    
    # ===== REFERENCIAS =====
    p = doc.add_paragraph()
    run = p.add_run("REFERENCIAS")
    run.font.size = Pt(14)
    run.font.color.rgb = AZUL_OSCURO
    run.font.bold = True
    run.font.name = "Calibri"
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p.paragraph_format.space_after = Pt(8)
    
    # Línea decorativa
    p = doc.add_paragraph()
    run = p.add_run("─" * 70)
    run.font.color.rgb = AZUL_CLARO
    run.font.size = Pt(8)
    p.paragraph_format.space_after = Pt(10)
    
    referencias = [
        "Hernández Sampieri, R., y Mendoza Torres, C. P. (2018). Metodología de la investigación: Las rutas cuantitativa, cualitativa y mixta. McGraw-Hill.",
        "Mendizábal, N. (2018). La osadía en la investigación: el uso de los métodos mixtos en las ciencias sociales. Espacio Abierto, 27(2), 5-20.",
        "Sánchez Flores, F. A. (2019). Fundamentos epistémicos de la investigación cualitativa y cuantitativa: consensos y disensos. Revista Digital de Investigación en Docencia Universitaria, 13(1), 77-91.",
    ]
    
    for ref in referencias:
        p = doc.add_paragraph()
        # Sangría francesa: primera línea normal, resto con sangría
        p.paragraph_format.first_line_indent = Cm(0)
        p.paragraph_format.left_indent = Cm(1.27)
        
        # Separar autor del título para itálica
        parts = ref.split("). ", 1)
        if len(parts) == 2:
            autor_year = parts[0] + "). "
            titulo_rest = parts[1]
            
            run1 = p.add_run(autor_year)
            run1.font.size = Pt(11)
            run1.font.color.rgb = GRIS_TEXTO
            run1.font.name = "Calibri"
            
            # Buscar el título en itálica (antes del primer punto o editorial)
            if ". " in titulo_rest:
                titulo_parts = titulo_rest.split(". ", 1)
                titulo = titulo_parts[0] + ". "
                resto = titulo_parts[1]
                
                run2 = p.add_run(titulo)
                run2.font.size = Pt(11)
                run2.font.color.rgb = GRIS_TEXTO
                run2.font.name = "Calibri"
                run2.font.italic = True
                
                run3 = p.add_run(resto)
                run3.font.size = Pt(11)
                run3.font.color.rgb = GRIS_TEXTO
                run3.font.name = "Calibri"
            else:
                run2 = p.add_run(titulo_rest)
                run2.font.size = Pt(11)
                run2.font.color.rgb = GRIS_TEXTO
                run2.font.name = "Calibri"
        else:
            run = p.add_run(ref)
            run.font.size = Pt(11)
            run.font.color.rgb = GRIS_TEXTO
            run.font.name = "Calibri"
        
        p.paragraph_format.space_after = Pt(6)
        p.paragraph_format.line_spacing = Pt(16)
    
    return doc


def main():
    script_dir = os.path.dirname(os.path.abspath(__file__))
    output_path = os.path.join(script_dir, "oviedo_alexander_cuadrocomparativo.docx")
    
    print("🔧 Generando cuadro comparativo en formato Word...")
    doc = create_document()
    doc.save(output_path)
    print(f"✅ Documento guardado: {output_path}")
    print(f"📄 Nombre del archivo: oviedo_alexander_cuadrocomparativo.docx")


if __name__ == "__main__":
    main()
