defmodule Aprsme.Repo.Migrations.AddMissingFieldsToPacketNotify do
  use Ecto.Migration

  def up do
    # Drop existing trigger and function
    execute "DROP TRIGGER IF EXISTS packets_notify_insert ON packets;"
    execute "DROP FUNCTION IF EXISTS notify_packets_insert();"

    # Create updated function that includes ALL fields that might be needed
    execute """
    CREATE OR REPLACE FUNCTION notify_packets_insert() RETURNS trigger AS $$
    DECLARE
      payload TEXT;
    BEGIN
      -- Build a comprehensive payload with all packet fields
      payload := json_build_object(
        'id', NEW.id,
        'sender', NEW.sender,
        'ssid', NEW.ssid,
        'base_callsign', NEW.base_callsign,
        'lat', NEW.lat,
        'lon', NEW.lon,
        'altitude', NEW.altitude,
        'course', NEW.course,
        'speed', NEW.speed,
        'symbol_table_id', NEW.symbol_table_id,
        'symbol_code', NEW.symbol_code,
        'device_identifier', NEW.device_identifier,
        'device_model', NEW.device_model,
        'device_vendor', NEW.device_vendor,
        'device_contact', NEW.device_contact,
        'device_class', NEW.device_class,
        'path', NEW.path,
        'data_type', NEW.data_type,
        'received_at', NEW.received_at,
        'comment', NEW.comment,
        'raw_packet', NEW.raw_packet,
        'phg_power', NEW.phg_power,
        'phg_height', NEW.phg_height,
        'phg_gain', NEW.phg_gain,
        'phg_directivity', NEW.phg_directivity,
        'temperature', NEW.temperature,
        'humidity', NEW.humidity,
        'pressure', NEW.pressure,
        'wind_speed', NEW.wind_speed,
        'wind_direction', NEW.wind_direction,
        'wind_gust', NEW.wind_gust,
        'rain_1h', NEW.rain_1h,
        'rain_24h', NEW.rain_24h,
        'rain_midnight', NEW.rain_midnight,
        'luminosity', NEW.luminosity,
        'snow_24h', NEW.snow_24h,
        'has_weather', NEW.has_weather,
        'inserted_at', NEW.inserted_at
      )::text;
      
      -- Notify on the aprs_packets channel
      PERFORM pg_notify('aprs_packets', payload);
      
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    """

    # Recreate trigger
    execute """
    CREATE TRIGGER packets_notify_insert
    AFTER INSERT ON packets
    FOR EACH ROW EXECUTE FUNCTION notify_packets_insert();
    """
  end

  def down do
    # Drop updated trigger and function
    execute "DROP TRIGGER IF EXISTS packets_notify_insert ON packets;"
    execute "DROP FUNCTION IF EXISTS notify_packets_insert();"

    # Restore previous version
    execute """
    CREATE OR REPLACE FUNCTION notify_packets_insert() RETURNS trigger AS $$
    DECLARE
      payload TEXT;
    BEGIN
      payload := json_build_object(
        'id', NEW.id,
        'sender', NEW.sender,
        'lat', NEW.lat,
        'lon', NEW.lon,
        'altitude', NEW.altitude,
        'course', NEW.course,
        'speed', NEW.speed,
        'symbol_table_id', NEW.symbol_table_id,
        'symbol_code', NEW.symbol_code,
        'device_identifier', NEW.device_identifier,
        'path', NEW.path,
        'received_at', NEW.received_at,
        'comment', NEW.comment,
        'raw_packet', NEW.raw_packet,
        'phg_power', NEW.phg_power,
        'phg_height', NEW.phg_height,
        'phg_gain', NEW.phg_gain,
        'phg_directivity', NEW.phg_directivity,
        'inserted_at', NEW.inserted_at
      )::text;
      PERFORM pg_notify('aprs_packets', payload);
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    """

    execute """
    CREATE TRIGGER packets_notify_insert
    AFTER INSERT ON packets
    FOR EACH ROW EXECUTE FUNCTION notify_packets_insert();
    """
  end
end
