from flask import Flask, render_template, request, jsonify
import pymysql
import pymysql.cursors
from datetime import datetime
import json
import os

app = Flask(__name__)

# ==================== CONFIGURACION ====================

DB_CONFIG = {
    'host': 'srv636.hstgr.io',
    'user': 'u733221342_Migsistemas',
    'password': 'Admin123*/',
    'db': 'u733221342_ordenservicio',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor,
    'connect_timeout': 10
}

TEMPLATES_FILE = 'templates.json'

# ==================== FUNCIONES DE TEMPLATES ====================

def get_templates_predeterminados():
    """Retorna templates predeterminados"""
    return [
        {"nombre": "Servicio OK", "texto": "Servicio realizado exitosamente sin novedades."},
        {"nombre": "Resolucion", "texto": "SE REALIZA LA ACTUALIZACION DE LA RESOLUCION DE FACTURACION ELECTRONICA LA CUAL SE HABIA VENCIDO POR CONSECUTIVOS, SE CONFIGURA LA NUEVA RESOLUCION SE EMPATA BIEN LOS CONSECUTIVOS, SE ASOCIA ESTA RESOLUCION EN LA DIAN A EDN Y EN LA PLATAFORMA, SE CONFIGURA CLAVE TECNICA Y SE TRANSMITE TODO LO PENDIENTE."},
        {"nombre": "CUFE Y QR", "texto": "EL CLIENTE REPORTA QUE NO SALE CUFE Y QR DEBIDO A QUE EL SISTEMA NO SE ENCONTRABA ACTUALIZADO INGRESE REINICIO EL SISTEMA PARA QUE SE CARGUE LA ACTUALIZACION Y SE LE PIDE QUE INTENTE NUEVAMENTE PARA CONFIRMAR QUE LE SALGA CUFE Y QR."},
        {"nombre": "No ingresa Mig", "texto": "Se atiende novedad reportada por el comercio, se realiza consulta de cantidad de usuarios de licencia en sistema y remotos, se realiza configuracion de cantidades en la informacion de la licencia, se realizan pruebas con cliente confirmando acceso y funcionamiento con el sistema, queda operativo y funcional."},
        {"nombre": "Migracion", "texto": "SE REALIZA LA MIGRACION DE TODO EL SISTEMA A SQL SERVER, SE PASA TODA LA INFORMACION, SE ACTIVA LA FACTURACION ELECTRONICA, EN LA PLATAFORMA Y EN EL SISTEMA, SE ASOCIA CLAVE TECNICA, SE INSTALA EL DRIVER DE LA IMPRESORA CON LAS MEDIDAS CORRECTAS, Y FINALMENTE SE HACEN PRUEBAS PARA VALIDAR QUE EL SISTEMA QUEDE FUNCIONANDO CORRECTAMENTE Y CON SU CUFE Y QR."},
    ]

def cargar_templates():
    """Carga todos los templates desde archivo"""
    try:
        if os.path.exists(TEMPLATES_FILE):
            with open(TEMPLATES_FILE, 'r', encoding='utf-8') as f:
                data = json.load(f)
                if isinstance(data, list):
                    return {"general": data}
                return data
        return {"general": get_templates_predeterminados()}
    except Exception as e:
        print(f"Error cargando templates: {e}")
        return {"general": get_templates_predeterminados()}

def guardar_templates(templates_data):
    """Guarda templates en archivo"""
    try:
        with open(TEMPLATES_FILE, 'w', encoding='utf-8') as f:
            json.dump(templates_data, f, ensure_ascii=False, indent=2)
        return True
    except Exception as e:
        print(f"Error guardando templates: {e}")
        return False

def get_templates_por_tecnico(tecnico):
    """Obtiene templates de un tecnico especifico"""
    all_templates = cargar_templates()
    
    if tecnico in all_templates:
        return all_templates[tecnico]
    elif "general" in all_templates:
        return all_templates["general"]
    else:
        return get_templates_predeterminados()

# ==================== RUTAS PRINCIPALES ====================

@app.route('/')
def index():
    """Pagina principal - Cierre de ordenes"""
    return render_template('index.html')

@app.route('/crear-tarea')
def crear_tarea_page():
    """Pagina de crear tarea rapida"""
    return render_template('crear-tarea-tecnico.html')

# ==================== API CONEXION ====================

@app.route('/api/conectar', methods=['POST'])
def conectar():
    """Conecta a la BD y obtiene lista de tecnicos"""
    try:
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        sql = """
            SELECT DISTINCT nombre_trab 
            FROM tarea 
            WHERE estado = 0 AND verificacion = 0 
            AND nombre_trab != 'PENDIENTE' 
            AND nombre_trab != 'Mary'
            ORDER BY nombre_trab
        """
        cursor.execute(sql)
        tecnicos = [row['nombre_trab'] for row in cursor.fetchall()]
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'tecnicos': tecnicos
        })
        
    except Exception as e:
        print(f"Error en conectar: {e}")
        return jsonify({'success': False, 'error': str(e)})

# ==================== API TAREAS ====================

@app.route('/api/tareas', methods=['POST'])
def obtener_tareas():
    """Obtiene tareas de un tecnico"""
    try:
        data = request.get_json()
        tecnico = data.get('tecnico')
        
        if not tecnico:
            return jsonify({'success': False, 'error': 'Tecnico no especificado'})
        
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        sql = """
            SELECT 
                T.id_tarea,
                T.descripcion as tarea,
                T.fechaTarea as fechaCreacion,
                T.nombre_trab,
                T.id_empresa,
                T.pendiente,
                E.punto_ven,
                E.ciudad
            FROM tarea T
            JOIN empresa E ON E.id_empresa = T.id_empresa
            WHERE T.nombre_trab = %s 
            AND T.estado = 0
            AND T.verificacion = 0
            AND T.nombre_trab != 'Mary'
            ORDER BY T.fechaTarea DESC, T.hora DESC
        """
        
        cursor.execute(sql, (tecnico,))
        tareas = cursor.fetchall()
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'tareas': tareas
        })
        
    except Exception as e:
        print(f"Error en obtener_tareas: {e}")
        return jsonify({'success': False, 'error': str(e)})

@app.route('/api/crear-tarea', methods=['POST'])
def crear_tarea_api():
    """Crea una nueva tarea"""
    try:
        data = request.get_json()
        
        nombre_trab = data.get('nombre_trab')
        id_empresa = data.get('id_empresa')
        tipo_orden = data.get('tipo_orden')
        descripcion = data.get('descripcion')
        tipo_tarea = data.get('tipo_tarea', '0')
        fecha_tarea = data.get('fecha_tarea')
        hora = data.get('hora')
        valor_orden = data.get('valor_orden', '0')
        
        if not all([nombre_trab, id_empresa, tipo_orden, descripcion, fecha_tarea, hora]):
            return jsonify({'success': False, 'error': 'Datos incompletos'})
        
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        fecha_creacion = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        sql = """
            INSERT INTO tarea (
                descripcion, id_empresa, id_orden, fechaTarea, fechaFinal,
                estado, factura, verificacion, nombre_trab, numero, valor,
                hora, tipo_orden, valor_orden, observacion, fechaCreacion,
                pendiente, fecha_seguimiento, tipoTarea, inicioOrden,
                fechaInicioOrden, fechaFinOrden
            ) VALUES (
                %s, %s, NULL, %s, NULL,
                0, 'NO', 0, %s, '', 0,
                %s, %s, %s, '', %s,
                0, NULL, %s, 0,
                NULL, NULL
            )
        """
        
        valores = (
            descripcion, id_empresa, fecha_tarea, nombre_trab,
            hora, tipo_orden, valor_orden, fecha_creacion, tipo_tarea
        )
        
        cursor.execute(sql, valores)
        id_tarea = conn.insert_id()
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Tarea creada exitosamente',
            'id_tarea': id_tarea
        })
        
    except Exception as e:
        print(f"Error en crear_tarea: {e}")
        return jsonify({'success': False, 'error': str(e)})

@app.route('/api/crear-tareas-masivo', methods=['POST'])
def crear_tareas_masivo():
    """Crea multiples tareas de forma masiva"""
    try:
        data = request.get_json()
        tareas = data.get('tareas', [])
        
        if not tareas:
            return jsonify({'success': False, 'error': 'No se proporcionaron tareas'})
        
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        fecha_creacion = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        sql = """
            INSERT INTO tarea (
                descripcion, id_empresa, id_orden, fechaTarea, fechaFinal,
                estado, factura, verificacion, nombre_trab, numero, valor,
                hora, tipo_orden, valor_orden, observacion, fechaCreacion,
                pendiente, fecha_seguimiento, tipoTarea, inicioOrden,
                fechaInicioOrden, fechaFinOrden
            ) VALUES (
                %s, %s, NULL, %s, NULL,
                0, 'NO', 0, %s, '', 0,
                %s, %s, %s, '', %s,
                0, NULL, %s, 0,
                NULL, NULL
            )
        """
        
        created_count = 0
        for tarea in tareas:
            try:
                valores = (
                    tarea['descripcion'],
                    tarea['id_empresa'],
                    tarea['fecha_tarea'],
                    tarea['nombre_trab'],
                    tarea['hora'],
                    tarea['tipo_orden'],
                    tarea['valor_orden'],
                    fecha_creacion,
                    tarea['tipo_tarea']
                )
                cursor.execute(sql, valores)
                created_count += 1
            except Exception as e:
                print(f"Error creando tarea individual: {e}")
                continue
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': f'{created_count} tareas creadas exitosamente',
            'created': created_count
        })
        
    except Exception as e:
        print(f"Error en crear_tareas_masivo: {e}")
        return jsonify({'success': False, 'error': str(e)})

@app.route('/api/asignar-tareas', methods=['POST'])
def asignar_tareas():
    """Asigna multiples tareas de forma masiva"""
    try:
        data = request.get_json()
        tareas_ids = data.get('tareas_ids', [])
        
        if not tareas_ids:
            return jsonify({'success': False, 'error': 'No se seleccionaron tareas'})
        
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        fecha_seguimiento = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        placeholders = ','.join(['%s'] * len(tareas_ids))
        sql = f"""
            UPDATE tarea 
            SET pendiente = 2,
                fecha_seguimiento = %s
            WHERE id_tarea IN ({placeholders})
            AND estado = 0
            AND verificacion = 0
        """
        
        cursor.execute(sql, [fecha_seguimiento] + tareas_ids)
        affected_rows = cursor.rowcount
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': f'{affected_rows} tareas asignadas exitosamente',
            'count': affected_rows
        })
        
    except Exception as e:
        print(f"Error en asignar_tareas: {e}")
        return jsonify({'success': False, 'error': str(e)})

# ==================== API ORDENES ====================

@app.route('/api/cerrar-orden', methods=['POST'])
def cerrar_orden():
    """Cierra una orden de servicio"""
    try:
        data = request.get_json()
        
        id_tarea = data.get('id_tarea')
        tecnico = data.get('tecnico')
        hora_ini = data.get('hora_ini')
        hora_final = data.get('hora_final')
        observaciones = data.get('observaciones')
        estado = data.get('estado', 'Finalizado')
        tipo_servicio = data.get('tipo_servicio', 'Virtual')
        
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        cursor.execute("""
            SELECT T.*, E.punto_ven, E.ciudad 
            FROM tarea T 
            JOIN empresa E ON E.id_empresa = T.id_empresa 
            WHERE T.id_tarea = %s
        """, (id_tarea,))
        tarea = cursor.fetchone()
        
        if not tarea:
            return jsonify({'success': False, 'error': 'Tarea no encontrada'})
        
        nombre_cliente = tarea['punto_ven']
        email_cliente = ''
        fecha_actual = datetime.now().strftime("%Y-%m-%d")
        nit_emp = tarea['id_empresa']
        fechacreacion = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        sql_insert = """
            INSERT INTO `orden` VALUES (
                null, %s, %s, %s, %s, %s, %s, %s, %s, 
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
            )
        """
        
        valores = (
            nombre_cliente, email_cliente, tecnico, fecha_actual,
            hora_ini, hora_final, nit_emp, tipo_servicio, '',
            estado, '', observaciones, '', '', '', '', id_tarea, fechacreacion
        )
        
        cursor.execute(sql_insert, valores)
        id_orden = conn.insert_id()
        
        sql_update = """
            UPDATE tarea 
            SET id_orden = %s, 
                estado = 1, 
                fechaFinal = %s, 
                nombre_trab = %s, 
                id_empresa = %s, 
                pendiente = 0 
            WHERE id_tarea = %s
        """
        
        cursor.execute(sql_update, (id_orden, fechacreacion, tecnico, nit_emp, id_tarea))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Orden cerrada exitosamente',
            'id_orden': id_orden
        })
        
    except Exception as e:
        print(f"Error en cerrar_orden: {e}")
        return jsonify({'success': False, 'error': str(e)})

# ==================== API CLIENTES ====================

@app.route('/api/clientes', methods=['POST'])
def obtener_clientes():
    """Obtiene lista de clientes activos"""
    try:
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        sql = """
            SELECT id_empresa, punto_ven, ciudad, observacion 
            FROM empresa 
            WHERE estado = 1
            ORDER BY punto_ven ASC
        """
        
        cursor.execute(sql)
        clientes = cursor.fetchall()
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'clientes': clientes
        })
        
    except Exception as e:
        print(f"Error en obtener_clientes: {e}")
        return jsonify({'success': False, 'error': str(e)})

# ==================== API TIPOS DE SERVICIO ====================

@app.route('/api/tipos-servicio', methods=['POST'])
def obtener_tipos_servicio():
    """Obtiene lista de tipos de servicio"""
    try:
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor()
        
        sql = """
            SELECT nombre, valor 
            FROM tipo_orden 
            ORDER BY nombre ASC
        """
        
        cursor.execute(sql)
        tipos = cursor.fetchall()
        
        cursor.close()
        conn.close()
        
        tipos_formateados = [{'nombre': t['nombre'], 'valor': t['valor']} for t in tipos]
        
        return jsonify({
            'success': True,
            'tipos': tipos_formateados
        })
        
    except Exception as e:
        print(f"Error en obtener_tipos_servicio: {e}")
        return jsonify({'success': False, 'error': str(e)})

# ==================== API TEMPLATES ====================

@app.route('/api/templates', methods=['GET'])
def obtener_templates():
    """Obtiene lista de templates de un tecnico"""
    try:
        tecnico = request.args.get('tecnico', 'general')
        templates = get_templates_por_tecnico(tecnico)
        return jsonify({
            'success': True,
            'templates': templates,
            'tecnico': tecnico
        })
    except Exception as e:
        print(f"Error en obtener_templates: {e}")
        return jsonify({'success': False, 'error': str(e)})

@app.route('/api/templates/agregar', methods=['POST'])
def agregar_template():
    """Agrega un nuevo template a un tecnico"""
    try:
        data = request.get_json()
        nombre = data.get('nombre')
        texto = data.get('texto')
        tecnico = data.get('tecnico', 'general')
        
        if not nombre or not texto:
            return jsonify({'success': False, 'error': 'Datos incompletos'})
        
        all_templates = cargar_templates()
        
        if tecnico not in all_templates:
            all_templates[tecnico] = []
        
        all_templates[tecnico].append({'nombre': nombre, 'texto': texto})
        
        if guardar_templates(all_templates):
            return jsonify({
                'success': True,
                'templates': all_templates[tecnico]
            })
        else:
            return jsonify({'success': False, 'error': 'No se pudo guardar'})
            
    except Exception as e:
        print(f"Error en agregar_template: {e}")
        return jsonify({'success': False, 'error': str(e)})

@app.route('/api/templates/editar', methods=['POST'])
def editar_template():
    """Edita un template existente"""
    try:
        data = request.get_json()
        index = data.get('index')
        nombre = data.get('nombre')
        texto = data.get('texto')
        tecnico = data.get('tecnico', 'general')
        
        if index is None or not nombre or not texto:
            return jsonify({'success': False, 'error': 'Datos incompletos'})
        
        all_templates = cargar_templates()
        
        if tecnico not in all_templates:
            return jsonify({'success': False, 'error': 'Tecnico no encontrado'})
        
        if 0 <= index < len(all_templates[tecnico]):
            all_templates[tecnico][index] = {'nombre': nombre, 'texto': texto}
            if guardar_templates(all_templates):
                return jsonify({
                    'success': True,
                    'templates': all_templates[tecnico]
                })
            else:
                return jsonify({'success': False, 'error': 'No se pudo guardar'})
        else:
            return jsonify({'success': False, 'error': 'Indice invalido'})
            
    except Exception as e:
        print(f"Error en editar_template: {e}")
        return jsonify({'success': False, 'error': str(e)})

@app.route('/api/templates/eliminar', methods=['POST'])
def eliminar_template():
    """Elimina un template"""
    try:
        data = request.get_json()
        index = data.get('index')
        tecnico = data.get('tecnico', 'general')
        
        if index is None:
            return jsonify({'success': False, 'error': 'Indice no especificado'})
        
        all_templates = cargar_templates()
        
        if tecnico not in all_templates:
            return jsonify({'success': False, 'error': 'Tecnico no encontrado'})
        
        if 0 <= index < len(all_templates[tecnico]):
            all_templates[tecnico].pop(index)
            if guardar_templates(all_templates):
                return jsonify({
                    'success': True,
                    'templates': all_templates[tecnico]
                })
            else:
                return jsonify({'success': False, 'error': 'No se pudo guardar'})
        else:
            return jsonify({'success': False, 'error': 'Indice invalido'})
            
    except Exception as e:
        print(f"Error en eliminar_template: {e}")
        return jsonify({'success': False, 'error': str(e)})

# ==================== MANEJO DE ERRORES ====================

@app.errorhandler(404)
def not_found(error):
    return jsonify({'success': False, 'error': 'Recurso no encontrado'}), 404

@app.errorhandler(500)
def internal_error(error):
    return jsonify({'success': False, 'error': 'Error interno del servidor'}), 500

# ==================== EJECUCION ====================

if __name__ == '__main__':
    if not os.path.exists(TEMPLATES_FILE):
        guardar_templates({"general": get_templates_predeterminados()})
    
    print("=" * 70)
    print("Sistema de Cierre de Ordenes - MIG Sistemas v1.5")
    print("=" * 70)
    print("Servidor: http://localhost:5000")
    print("Presiona Ctrl+C para detener")
    print("Nuevo: Crear Tareas Rapidas + Plantillas por tecnico")
    print("=" * 70)
    
    app.run(debug=True, host='0.0.0.0', port=5000)