defmodule Towerops.Preseem.Insight do
  @moduledoc """
  Generated insights from Preseem data analysis - deviations, capacity warnings,
  firmware recommendations, and performance observations.
  """
  use Ecto.Schema

  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id

  @valid_types ~w(qoe_degradation capacity_saturation firmware_opportunity model_underperforming subscriber_growth config_drift snmp_cpu_high snmp_memory_high snmp_disk_high device_poll_gap agent_offline firmware_mismatch reconciliation_finding subscriber_growth_trend suspect_config_change)
  @valid_urgencies ~w(critical warning info)
  @valid_statuses ~w(active dismissed resolved)
  @valid_channels ~w(proactive contextual passive)
  @valid_sources ~w(preseem snmp gaiia system)

  schema "preseem_insights" do
    field :type, :string
    field :urgency, :string
    field :status, :string, default: "active"
    field :channel, :string
    field :title, :string
    field :description, :string
    field :metadata, :map
    field :dismissed_at, :utc_datetime
    field :source, :string, default: "preseem"

    belongs_to :organization, Towerops.Organizations.Organization
    belongs_to :preseem_access_point, Towerops.Preseem.AccessPoint
    belongs_to :device, Towerops.Devices.Device
    belongs_to :site, Towerops.Sites.Site
    belongs_to :agent_token, Towerops.Agents.AgentToken

    timestamps(type: :utc_datetime)
  end

  def changeset(insight, attrs) do
    insight
    |> cast(attrs, [
      :organization_id,
      :preseem_access_point_id,
      :device_id,
      :site_id,
      :agent_token_id,
      :type,
      :urgency,
      :status,
      :channel,
      :title,
      :description,
      :metadata,
      :dismissed_at,
      :source
    ])
    |> validate_required([:organization_id, :type, :urgency, :channel, :title])
    |> validate_inclusion(:type, @valid_types)
    |> validate_inclusion(:urgency, @valid_urgencies)
    |> validate_inclusion(:status, @valid_statuses)
    |> validate_inclusion(:channel, @valid_channels)
    |> validate_inclusion(:source, @valid_sources)
    |> foreign_key_constraint(:organization_id)
    |> foreign_key_constraint(:preseem_access_point_id)
    |> foreign_key_constraint(:device_id)
    |> foreign_key_constraint(:site_id)
    |> foreign_key_constraint(:agent_token_id)
  end
end
