-- Script para corregir consultas que no tienen estado
-- Este script actualiza las consultas existentes que tienen estado NULL o vacío

-- Actualizar consultas sin estado a 'pendiente' si no tienen detalles completados
UPDATE consultas 
SET estado = 'pendiente'
WHERE estado IS NULL 
   OR estado = ''
   OR estado NOT IN ('pendiente', 'procesando', 'completada', 'error', 'cancelada');

-- Actualizar consultas que tienen todos los detalles completados a 'completada'
UPDATE consultas c
SET c.estado = 'completada',
    c.completed_at = (
      SELECT MAX(updated_at) 
      FROM consulta_detalles 
      WHERE consulta_id = c.id 
        AND estado = 'completado'
    )
WHERE c.estado IN ('pendiente', 'procesando')
  AND EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id
  )
  AND NOT EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id 
      AND cd.estado NOT IN ('completado', 'error')
  )
  AND (
    SELECT COUNT(*) 
    FROM consulta_detalles 
    WHERE consulta_id = c.id 
      AND estado = 'completado'
  ) > 0;

-- Actualizar consultas que tienen detalles en procesamiento a 'procesando'
UPDATE consultas c
SET c.estado = 'procesando'
WHERE c.estado = 'pendiente'
  AND EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id 
      AND cd.estado = 'procesando'
  );

-- Actualizar consultas que solo tienen errores a 'error'
UPDATE consultas c
SET c.estado = 'error',
    c.error_message = 'Error al procesar la consulta'
WHERE c.estado IN ('pendiente', 'procesando')
  AND EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id
  )
  AND NOT EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id 
      AND cd.estado = 'completado'
  )
  AND NOT EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id 
      AND cd.estado = 'procesando'
  )
  AND EXISTS (
    SELECT 1 
    FROM consulta_detalles cd 
    WHERE cd.consulta_id = c.id 
      AND cd.estado = 'error'
  );


