-- Fase 1: soporte multi-RUC (Emisor / Establecimiento / Punto de emision)
--
-- Migracion escrita a mano (no generada por `prisma migrate dev`) porque el diff automatico de
-- Prisma no reconoce renames: al correr `prisma migrate dev --create-only` sobre el nuevo schema
-- propuso DROP TABLE "empresas" (1 fila) + CREATE TABLE "emisores", y DROP COLUMN "empresaId" +
-- ADD COLUMN "emisorId" en certificados (7 filas no nulas) -- perdida total de esos datos. En su
-- lugar se usan RENAME TABLE/COLUMN/CONSTRAINT para preservar filas, ids y relaciones existentes.

-- ============================================================================
-- 1) Empresa -> Emisor: renombrar la tabla existente (conserva la fila y su id)
-- ============================================================================
ALTER TABLE "empresas" RENAME TO "emisores";
ALTER TABLE "emisores" RENAME CONSTRAINT "empresas_pkey" TO "emisores_pkey";
ALTER INDEX "empresas_ruc_key" RENAME TO "emisores_ruc_key";

ALTER TABLE "emisores"
  ADD COLUMN "regimenTributario" TEXT,
  ADD COLUMN "obligadoContabilidad" BOOLEAN NOT NULL DEFAULT false,
  ADD COLUMN "tipoEmision" TEXT NOT NULL DEFAULT 'NORMAL',
  ADD COLUMN "activo" BOOLEAN NOT NULL DEFAULT true;

-- ============================================================================
-- 2) Certificado.empresaId -> emisorId (conserva los certificados existentes y su vinculo)
-- ============================================================================
ALTER TABLE "certificados" RENAME COLUMN "empresaId" TO "emisorId";
ALTER TABLE "certificados" RENAME CONSTRAINT "certificados_empresaId_fkey" TO "certificados_emisorId_fkey";

-- ============================================================================
-- 3) Establecimientos (sucursales) de un Emisor
-- ============================================================================
CREATE TABLE "establecimientos" (
    "id" TEXT NOT NULL,
    "emisorId" TEXT NOT NULL,
    "codigo" TEXT NOT NULL,
    "nombre" TEXT NOT NULL,
    "direccion" TEXT,
    "logoRef" TEXT,
    "activo" BOOLEAN NOT NULL DEFAULT true,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "establecimientos_pkey" PRIMARY KEY ("id")
);

CREATE UNIQUE INDEX "establecimientos_emisorId_codigo_key" ON "establecimientos"("emisorId", "codigo");

ALTER TABLE "establecimientos" ADD CONSTRAINT "establecimientos_emisorId_fkey" FOREIGN KEY ("emisorId") REFERENCES "emisores"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- ============================================================================
-- 4) Puntos de emision de un Establecimiento
-- ============================================================================
CREATE TABLE "puntos_emision" (
    "id" TEXT NOT NULL,
    "establecimientoId" TEXT NOT NULL,
    "codigo" TEXT NOT NULL,
    "nombre" TEXT,
    "activo" BOOLEAN NOT NULL DEFAULT true,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "puntos_emision_pkey" PRIMARY KEY ("id")
);

CREATE UNIQUE INDEX "puntos_emision_establecimientoId_codigo_key" ON "puntos_emision"("establecimientoId", "codigo");

ALTER TABLE "puntos_emision" ADD CONSTRAINT "puntos_emision_establecimientoId_fkey" FOREIGN KEY ("establecimientoId") REFERENCES "establecimientos"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- ============================================================================
-- 5) Relacion opcional con el emisor en clientes, productos y comprobantes.
--    Se agrega nullable (todavia no hay contexto de "usuario -> emisor" ni seleccion de RUC por
--    request, eso corresponde a una fase posterior) y se completa por backfill mas abajo para
--    las filas existentes; el codigo de aplicacion la completa desde ahora para las filas nuevas.
-- ============================================================================
ALTER TABLE "clientes" ADD COLUMN "emisorId" TEXT;
CREATE INDEX "clientes_emisorId_idx" ON "clientes"("emisorId");
ALTER TABLE "clientes" ADD CONSTRAINT "clientes_emisorId_fkey" FOREIGN KEY ("emisorId") REFERENCES "emisores"("id") ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE "productos" ADD COLUMN "emisorId" TEXT;
CREATE INDEX "productos_emisorId_idx" ON "productos"("emisorId");
ALTER TABLE "productos" ADD CONSTRAINT "productos_emisorId_fkey" FOREIGN KEY ("emisorId") REFERENCES "emisores"("id") ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE "comprobantes" ADD COLUMN "emisorId" TEXT;
CREATE INDEX "comprobantes_emisorId_idx" ON "comprobantes"("emisorId");
ALTER TABLE "comprobantes" ADD CONSTRAINT "comprobantes_emisorId_fkey" FOREIGN KEY ("emisorId") REFERENCES "emisores"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- ============================================================================
-- 6) Backfill: el emisor migrado (la antigua "empresa", o la mas antigua si hubiera mas de una
--    fila por algun motivo) recibe su establecimiento matriz "001" y su punto de emision "001",
--    construidos con los datos ya existentes (dirMatriz). Clientes/productos/comprobantes previos
--    a esta fase no tenian ningun RUC asociado (el sistema era single-empresa), asi que tambien se
--    backfillean contra ese mismo emisor para no dejar historicos huerfanos.
--    Si no existe ningun emisor (base de datos nueva/vacia), este bloque no hace nada.
-- ============================================================================
DO $$
DECLARE
  emisor_migrado_id TEXT;
  nuevo_establecimiento_id TEXT;
BEGIN
  SELECT "id" INTO emisor_migrado_id FROM "emisores" ORDER BY "createdAt" ASC LIMIT 1;

  IF emisor_migrado_id IS NOT NULL THEN
    nuevo_establecimiento_id := gen_random_uuid()::text;

    INSERT INTO "establecimientos" ("id", "emisorId", "codigo", "nombre", "direccion", "activo", "createdAt", "updatedAt")
    SELECT nuevo_establecimiento_id, "id", '001', 'Matriz', "dirMatriz", true, now(), now()
    FROM "emisores" WHERE "id" = emisor_migrado_id;

    INSERT INTO "puntos_emision" ("id", "establecimientoId", "codigo", "nombre", "activo", "createdAt", "updatedAt")
    VALUES (gen_random_uuid()::text, nuevo_establecimiento_id, '001', 'Punto de emision principal', true, now(), now());

    UPDATE "clientes" SET "emisorId" = emisor_migrado_id WHERE "emisorId" IS NULL;
    UPDATE "productos" SET "emisorId" = emisor_migrado_id WHERE "emisorId" IS NULL;
    UPDATE "comprobantes" SET "emisorId" = emisor_migrado_id WHERE "emisorId" IS NULL;
  END IF;
END $$;
