from database import get_db
from config import Config
from validators import format_date_for_db

class AsistenciaService:
    def __init__(self):
        self.db = None
    
    def connect(self):
        self.db = get_db()
    
    def close(self):
        if self.db:
            self.db.close()
    
    def get_colaboradores(self, id_nodo, account_types):
        sql = f"""
        WITH estructura AS (
          SELECT id_struct, id_padre, nombre_struct
          FROM key_estructura
          WHERE id_struct = ? AND instancia = ?
          UNION ALL
          SELECT e.id_struct, e.id_padre, e.nombre_struct
          FROM key_estructura e
          INNER JOIN estructura o ON o.id_struct = e.id_padre
        )
        SELECT
            U.UserID,
            U.DEFAULTDEPTID,
            e.nombre_struct AS DEPTNAME,
            U.Name,
            U.habilitado,
            U.rut_formato_3 AS rut
        FROM USERINFO U
        INNER JOIN estructura e ON U.id_estructura = e.id_struct
        WHERE U.TIPO_CUENTA IN ({account_types})
          AND U.instancia = ?
          AND U.habilitado > -1
        ORDER BY U.Name
        """
        
        params = [id_nodo, Config.INSTANCIA, Config.INSTANCIA]
        
        cursor = self.db.execute_query(sql, params)
        return self.db.fetch_all(cursor)
    
    def get_asistencia_por_dia(self, fecha_inicio, fecha_fin, user_id):
        sql = f"""
        EXEC PRColabporDia ?, ?, ?, ?, 1
        """
        params = [fecha_inicio, fecha_fin, Config.INSTANCIA, user_id]
        
        cursor = self.db.execute_query(sql, params)
        return self.db.fetch_all(cursor)
    
    def procesar_asistencia(self, colaboradores, fecha_inicio, fecha_fin):
        resultados = []
        
        for colab in colaboradores:
            user_id = colab['UserID']
            nombre = colab['Name']
            division = colab['DEPTNAME']
            rut = colab['rut']
            
            asistencias = self.get_asistencia_por_dia(fecha_inicio, fecha_fin, user_id)
            
            obs = 1
            for asistencia in asistencias:
                entrada = asistencia.get('tEntrada', '')
                salida = asistencia.get('tSalida', '')
                
                if entrada and salida:
                    resultados.append({
                        'obs': obs,
                        'division': division,
                        'nombre': nombre,
                        'rut': rut,
                        'fecha': asistencia.get('tfecha', ''),
                        'marca_entrada': entrada,
                        'marca_salida': salida,
                        'salida_almorzar': asistencia.get('tinicioColacion', ''),
                        'llegada_almorzar': asistencia.get('tfinColacion', ''),
                        'tiempo_antes_almuerzo': asistencia.get('tAntesAlmorzar', ''),
                        'almuerzo': asistencia.get('tdelta', ''),
                        'tiempo_despues_almuerzo': asistencia.get('tDespuesAlmorzar', '')
                    })
                    obs += 1
        
        return resultados
