-- Create constructeurs table
CREATE TABLE "constructeurs" (
  "id" TEXT PRIMARY KEY,
  "name" TEXT NOT NULL,
  "email" TEXT,
  "phone" TEXT,
  "createdAt" TIMESTAMP NOT NULL DEFAULT NOW(),
  "updatedAt" TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE UNIQUE INDEX "constructeurs_name_unique_idx" ON "constructeurs"(LOWER("name"));

-- Add foreign key columns to machines, composants, pieces
ALTER TABLE "machines" ADD COLUMN "constructeurId" TEXT;
ALTER TABLE "composants" ADD COLUMN "constructeurId" TEXT;
ALTER TABLE "pieces" ADD COLUMN "constructeurId" TEXT;

-- Populate constructeurs from existing data
WITH existing_names AS (
  SELECT DISTINCT TRIM(constructeur) AS name FROM "machines" WHERE constructeur IS NOT NULL AND TRIM(constructeur) <> ''
  UNION
  SELECT DISTINCT TRIM(constructeur) FROM "composants" WHERE constructeur IS NOT NULL AND TRIM(constructeur) <> ''
  UNION
  SELECT DISTINCT TRIM(constructeur) FROM "pieces" WHERE constructeur IS NOT NULL AND TRIM(constructeur) <> ''
),
prepared AS (
  SELECT DISTINCT ON (LOWER(name)) name
  FROM existing_names
  WHERE name IS NOT NULL AND name <> ''
  ORDER BY LOWER(name), name
)
INSERT INTO "constructeurs" ("id", "name")
SELECT substr(md5(random()::text || clock_timestamp()::text), 1, 25), name
FROM prepared
ON CONFLICT (LOWER("name")) DO NOTHING;

-- Link existing records to constructeurs
UPDATE "machines" m
SET "constructeurId" = c.id
FROM "constructeurs" c
WHERE m.constructeur IS NOT NULL
  AND TRIM(m.constructeur) <> ''
  AND LOWER(c.name) = LOWER(TRIM(m.constructeur));

UPDATE "composants" co
SET "constructeurId" = c.id
FROM "constructeurs" c
WHERE co.constructeur IS NOT NULL
  AND TRIM(co.constructeur) <> ''
  AND LOWER(c.name) = LOWER(TRIM(co.constructeur));

UPDATE "pieces" p
SET "constructeurId" = c.id
FROM "constructeurs" c
WHERE p.constructeur IS NOT NULL
  AND TRIM(p.constructeur) <> ''
  AND LOWER(c.name) = LOWER(TRIM(p.constructeur));

-- Drop legacy constructeur columns
ALTER TABLE "machines" DROP COLUMN "constructeur";
ALTER TABLE "composants" DROP COLUMN "constructeur";
ALTER TABLE "pieces" DROP COLUMN "constructeur";

-- Add foreign key constraints
ALTER TABLE "machines"
  ADD CONSTRAINT "machines_constructeurId_fkey"
  FOREIGN KEY ("constructeurId") REFERENCES "constructeurs"("id")
  ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE "composants"
  ADD CONSTRAINT "composants_constructeurId_fkey"
  FOREIGN KEY ("constructeurId") REFERENCES "constructeurs"("id")
  ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE "pieces"
  ADD CONSTRAINT "pieces_constructeurId_fkey"
  FOREIGN KEY ("constructeurId") REFERENCES "constructeurs"("id")
  ON DELETE SET NULL ON UPDATE CASCADE;
