-- 0053 - Measurement units (entry-unit tracking + interest dual-store)
--
-- Problem: dimensions on interests/yachts/berths are stored in ft OR m, but
-- the CRM blindly converts between them on display. When a rep edits the
-- converted side, the original entered value drifts by floating-point error
-- (e.g. 18.29m → 60.039ft → back to 18.297m).
--
-- Fix: every dimension gets two pieces of info - a value column per unit
-- (so we can render the user's literal entry verbatim) AND a small
-- discriminator column (`*_unit`) saying which side the user originally
-- typed in. The form prefers the entered unit when displaying; the other
-- unit is computed only for export pathways (EOI PDF, recommender).
--
-- Interests previously only stored ft; this migration adds *_m columns
-- alongside. Yachts + berths already store both; only the discriminator
-- needs to be added.
--
-- Backfill: existing rows are flagged as `ft`-entered since that was the
-- only way to enter them before this change. m-side values get computed
-- (only for interests where they were null) via `* 0.3048`.

-- ── interests: dual-store + discriminator ─────────────────────────────────
ALTER TABLE interests
  ADD COLUMN IF NOT EXISTS desired_length_m numeric,
  ADD COLUMN IF NOT EXISTS desired_width_m  numeric,
  ADD COLUMN IF NOT EXISTS desired_draft_m  numeric,
  ADD COLUMN IF NOT EXISTS desired_length_unit text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS desired_width_unit  text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS desired_draft_unit  text NOT NULL DEFAULT 'ft';

UPDATE interests SET desired_length_m = ROUND(desired_length_ft * 0.3048::numeric, 2) WHERE desired_length_m IS NULL AND desired_length_ft IS NOT NULL;
UPDATE interests SET desired_width_m  = ROUND(desired_width_ft  * 0.3048::numeric, 2) WHERE desired_width_m  IS NULL AND desired_width_ft  IS NOT NULL;
UPDATE interests SET desired_draft_m  = ROUND(desired_draft_ft  * 0.3048::numeric, 2) WHERE desired_draft_m  IS NULL AND desired_draft_ft  IS NOT NULL;

-- ── yachts: discriminator only ────────────────────────────────────────────
ALTER TABLE yachts
  ADD COLUMN IF NOT EXISTS length_unit text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS width_unit  text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS draft_unit  text NOT NULL DEFAULT 'ft';

-- ── berths: discriminator only (multi-axis) ───────────────────────────────
ALTER TABLE berths
  ADD COLUMN IF NOT EXISTS length_unit         text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS width_unit          text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS draft_unit          text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS nominal_boat_size_unit text NOT NULL DEFAULT 'ft',
  ADD COLUMN IF NOT EXISTS water_depth_unit    text NOT NULL DEFAULT 'ft';

-- Constrain to known values. (Cheaper than a separate enum type for two
-- string values, and easier to drop if we ever add a third unit.)
ALTER TABLE interests
  ADD CONSTRAINT chk_interest_desired_length_unit CHECK (desired_length_unit IN ('ft','m')),
  ADD CONSTRAINT chk_interest_desired_width_unit  CHECK (desired_width_unit  IN ('ft','m')),
  ADD CONSTRAINT chk_interest_desired_draft_unit  CHECK (desired_draft_unit  IN ('ft','m'));
ALTER TABLE yachts
  ADD CONSTRAINT chk_yacht_length_unit CHECK (length_unit IN ('ft','m')),
  ADD CONSTRAINT chk_yacht_width_unit  CHECK (width_unit  IN ('ft','m')),
  ADD CONSTRAINT chk_yacht_draft_unit  CHECK (draft_unit  IN ('ft','m'));
ALTER TABLE berths
  ADD CONSTRAINT chk_berth_length_unit            CHECK (length_unit            IN ('ft','m')),
  ADD CONSTRAINT chk_berth_width_unit             CHECK (width_unit             IN ('ft','m')),
  ADD CONSTRAINT chk_berth_draft_unit             CHECK (draft_unit             IN ('ft','m')),
  ADD CONSTRAINT chk_berth_nominal_boat_size_unit CHECK (nominal_boat_size_unit IN ('ft','m')),
  ADD CONSTRAINT chk_berth_water_depth_unit       CHECK (water_depth_unit       IN ('ft','m'));
