-- camping_registry.sql — registre des CAMPINGS + géoloc de remplacement FIXE sur tous leurs lots.
--
-- Problème : pour un lot de camping, l'adresse du Service Location est souvent l'adresse de RÉSIDENCE du
-- client (ex. « 428 Rue … ») et la rue interne du camping (ex. « 2 rue Canard, Lac des Pins ») n'existe pas
-- dans le RQA → géoloc fausse. Solution : une coordonnée FIXE = l'adresse principale du camping (le tech
-- navigue jusqu'au camping, puis trouve le terrain sur place). Data-driven (table) → réutilisable + éditable.
--
-- Idempotent : CREATE IF NOT EXISTS + seed WHERE NOT EXISTS + apply re-jouable. Match par VILLE normalisée.
\timing on
BEGIN;

CREATE TABLE IF NOT EXISTS camping_registry (
  id serial PRIMARY KEY,
  keyword text NOT NULL UNIQUE,     -- motif (minuscule, sans accent) cherché dans la ville du Service Location
  name text NOT NULL,               -- nom du camping
  address text,                     -- adresse principale (référence affichée)
  latitude double precision NOT NULL,
  longitude double precision NOT NULL,
  active boolean DEFAULT true,
  created_at timestamp DEFAULT now()
);

-- Seed (coords = adresse principale, relevées dans le legacy delivery). Plusieurs motifs → même camping/coords.
INSERT INTO camping_registry (keyword, name, address, latitude, longitude)
SELECT * FROM (VALUES
  ('lac des pins',  'Camping Lac des Pins',          '3625 Route 201, Saint-Antoine-Abbé J0S 1N0', 45.062428, -73.911331),
  ('lac de pins',   'Camping Lac des Pins',          '3625 Route 201, Saint-Antoine-Abbé J0S 1N0', 45.062428, -73.911331),
  ('dauphinais',    'Camping Le Domaine Dauphinais', '199 Route 219 Sud, Hemmingford J0L 1H0',     45.023808, -73.608696),
  ('sandysun',      'Camping du Lac SandySun',       '1935A Chemin Grimshaw, Franklin J0S 1E0',    45.048569, -73.916870),
  ('sandy sun',     'Camping du Lac SandySun',       '1935A Chemin Grimshaw, Franklin J0S 1E0',    45.048569, -73.916870),
  ('frontiere',     'Camping Frontière',             '474 Chemin Covey Hill, Havelock J0S 2C0',    45.018734, -73.761551),
  ('ensoleill',     'Camping Domaine Ensoleillé',    '524 Rang St-Paul, Saint-Rémi J0L 2L0',       45.267612, -73.600517)
) v(keyword,name,address,latitude,longitude)
WHERE NOT EXISTS (SELECT 1 FROM camping_registry c WHERE c.keyword = v.keyword);

-- Application : force la géoloc du camping sur tous les lots (match ville normalisée). Conserve address_line
-- (le n° de terrain/rue interne reste visible) ; linked_address = le camping ; statut = validated (coord de service OK).
WITH applied AS (
  UPDATE "tabService Location" sl SET
    latitude = c.latitude,
    longitude = c.longitude,
    linked_address = c.name || ' — ' || COALESCE(c.address, ''),
    aq_address_id = NULL,
    address_validation_status = 'validated',
    address_validated_at = NOW(),
    modified = NOW()
  FROM camping_registry c
  WHERE c.active
    AND lower(unaccent(coalesce(sl.city, ''))) LIKE '%' || c.keyword || '%'
  RETURNING c.name AS camping
)
SELECT camping, count(*) AS lots_corriges FROM applied GROUP BY camping ORDER BY 2 DESC;

COMMIT;
