-- Migration 2026-04-17 : lier users ↔ contacts ↔ LDAP proprement (FK + index)
--
-- Avant : users.itop_person_id (int) pointe vers iTop (pas vers contacts.id)
--         -> lien indirect fragile entre users et contacts via itop_id
--
-- Apres : users.contact_id (FK propre vers contacts.id)
--         contacts.ldap_dn (trace la source AD quand le contact vient d'un import LDAP)
--         Les 3 tables sont jointes directement : users.contact_id = contacts.id
--         La source LDAP est identifiee par contacts.ldap_dn IS NOT NULL et/ou
--         users.auth_type = 'ldap'.

BEGIN;

-- 1. users.contact_id : FK vers contacts.id
ALTER TABLE users ADD COLUMN IF NOT EXISTS contact_id INTEGER;
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM pg_constraint WHERE conname = 'users_contact_id_fkey'
    ) THEN
        ALTER TABLE users ADD CONSTRAINT users_contact_id_fkey
            FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE SET NULL;
    END IF;
END$$;
CREATE INDEX IF NOT EXISTS idx_users_contact_id ON users (contact_id);

-- 2. contacts.ldap_dn : trace provenance AD
ALTER TABLE contacts ADD COLUMN IF NOT EXISTS ldap_dn varchar(500);
CREATE INDEX IF NOT EXISTS idx_contacts_ldap_dn ON contacts (ldap_dn)
    WHERE ldap_dn IS NOT NULL;

-- 3. Backfill users.contact_id depuis users.email <-> contacts.email
--    (pour les users deja presents dont l'email matche un contact)
UPDATE users u
   SET contact_id = c.id
  FROM contacts c
 WHERE u.contact_id IS NULL
   AND u.email IS NOT NULL
   AND lower(u.email) = lower(c.email);

COMMENT ON COLUMN users.contact_id IS 'FK vers contacts.id — lien direct user ↔ contact (le meme email)';
COMMENT ON COLUMN contacts.ldap_dn IS 'DN AD d''ou provient ce contact (import LDAP). NULL si import iTop ou saisie manuelle';

COMMIT;
