defmodule Microwaveprop.Repo.Migrations.CreatePskrRecalibrationTables do
  use Ecto.Migration

  # Two-table layout for the PSKR-driven recalibration analysis:
  #
  #   * `pskr_recalibration_runs` — one row per scheduled run with
  #     corpus stats and run status. Cheap to scan, fronts the
  #     analysis tables.
  #   * `pskr_feature_bins` — one row per (run, band, feature, bin)
  #     with spot-density stats. The recalibrator generates these by
  #     bucketing the corpus on each scoring feature so an operator
  #     can read directly: "at PWAT 40-55 mm, 10 GHz cells averaged
  #     N spots vs M at 15-25 mm — is that real or sampling noise?"
  #
  # Bins beat continuous regression for the operator workflow:
  # the algorithm's per-band weights are also discrete thresholds
  # (`@band_configs`), so matching the shape lets the operator copy
  # adjusted thresholds back into `BandConfig` without translation.

  def change do
    create table(:pskr_recalibration_runs, primary_key: false) do
      add :id, :binary_id, primary_key: true
      add :run_at, :utc_datetime, null: false
      add :status, :string, null: false
      add :sample_count, :integer, null: false, default: 0
      add :band_count, :integer, null: false, default: 0
      add :earliest_sample, :utc_datetime
      add :latest_sample, :utc_datetime
      add :avg_spots_per_sample, :float
      add :notes, :text

      timestamps(type: :utc_datetime)
    end

    create index(:pskr_recalibration_runs, [:run_at])

    create table(:pskr_feature_bins, primary_key: false) do
      add :id, :binary_id, primary_key: true

      add :run_id,
          references(:pskr_recalibration_runs, type: :binary_id, on_delete: :delete_all),
          null: false

      add :band, :string, null: false
      add :feature, :string, null: false
      add :bin_label, :string, null: false
      add :bin_min, :float
      add :bin_max, :float
      add :sample_count, :integer, null: false, default: 0
      add :spot_count_total, :integer, null: false, default: 0
      add :spot_count_avg, :float
      add :spot_count_p50, :float
      add :spot_count_p90, :float

      timestamps(type: :utc_datetime)
    end

    create unique_index(:pskr_feature_bins, [:run_id, :band, :feature, :bin_label])
    create index(:pskr_feature_bins, [:run_id])
  end
end
