-- CreateTable
CREATE TABLE `Role` (
    `id` VARCHAR(191) NOT NULL,
    `name` ENUM('ADMIN', 'DIGITADOR', 'VALIDADOR', 'CONSULTA') NOT NULL,
    `description` VARCHAR(191) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Role_name_key`(`name`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `User` (
    `id` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `passwordHash` VARCHAR(191) NOT NULL,
    `roleId` VARCHAR(191) NOT NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `lastLoginAt` DATETIME(3) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    UNIQUE INDEX `User_email_key`(`email`),
    INDEX `User_roleId_idx`(`roleId`),
    INDEX `User_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `EmpadronamientoFicha` (
    `id` VARCHAR(191) NOT NULL,
    `codigo` VARCHAR(191) NOT NULL,
    `estadoFicha` ENUM('BORRADOR', 'COMPLETA', 'INCOMPLETA', 'EN_REVISION', 'ARCHIVADA') NOT NULL DEFAULT 'BORRADOR',
    `observacionesRelevantes` TEXT NULL,
    `createdById` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    UNIQUE INDEX `EmpadronamientoFicha_codigo_key`(`codigo`),
    INDEX `EmpadronamientoFicha_createdById_idx`(`createdById`),
    INDEX `EmpadronamientoFicha_estadoFicha_idx`(`estadoFicha`),
    INDEX `EmpadronamientoFicha_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Ocupante` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `nombre` VARCHAR(191) NULL,
    `rut` VARCHAR(191) NULL,
    `correoElectronico` VARCHAR(191) NULL,
    `telefono` VARCHAR(191) NULL,
    `fechaNacimiento` DATETIME(3) NULL,
    `anioLlegadaSector` INTEGER NULL,
    `estadoCivil` ENUM('CASADO', 'VIUDO', 'DIVORCIADO', 'SOLTERO') NULL,
    `situacionLaboral` ENUM('INDEPENDIENTE', 'DEPENDIENTE', 'PENSIONADO', 'JUBILADO', 'CESANTE') NULL,
    `cantidadPersonasLote` INTEGER NULL,
    `tramoRsh` VARCHAR(191) NULL,
    `observaciones` TEXT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Ocupante_fichaId_key`(`fichaId`),
    INDEX `Ocupante_rut_idx`(`rut`),
    INDEX `Ocupante_nombre_idx`(`nombre`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `OcupanteActualLote` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `nombreCompleto` VARCHAR(191) NULL,
    `rut` VARCHAR(191) NULL,
    `edad` INTEGER NULL,
    `parentesco` ENUM('HIJO', 'CONYUGE', 'ESPOSO', 'PADRE', 'MADRE', 'ABUELO', 'TIO', 'SOBRINO', 'NIETO', 'OTRO') NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    INDEX `OcupanteActualLote_fichaId_idx`(`fichaId`),
    INDEX `OcupanteActualLote_rut_idx`(`rut`),
    INDEX `OcupanteActualLote_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Lote` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `lote` VARCHAR(191) NULL,
    `manzana` VARCHAR(191) NULL,
    `direccionLote` VARCHAR(191) NULL,
    `nombreAsociado` VARCHAR(191) NULL,
    `resolucion` VARCHAR(191) NULL,
    `fojas` VARCHAR(191) NULL,
    `numero` VARCHAR(191) NULL,
    `anio` INTEGER NULL,
    `rol` VARCHAR(191) NULL,
    `situacionLote` ENUM('CON_DUENO', 'CON_RESOLUCION', 'SIN_RESOLUCION', 'SIN_OCUPANTE', 'INHABILITADO_SERVIU', 'SEDE_SOCIAL', 'OTRO') NOT NULL DEFAULT 'SIN_RESOLUCION',
    `duenoAsignatario` VARCHAR(191) NULL,
    `rutDuenoAsignatario` VARCHAR(191) NULL,
    `contribuciones` VARCHAR(191) NULL,
    `estadoHabitabilidad` ENUM('HABITADO', 'DESHABITADO') NOT NULL DEFAULT 'HABITADO',
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Lote_fichaId_key`(`fichaId`),
    INDEX `Lote_lote_idx`(`lote`),
    INDEX `Lote_manzana_idx`(`manzana`),
    INDEX `Lote_rol_idx`(`rol`),
    INDEX `Lote_resolucion_idx`(`resolucion`),
    INDEX `Lote_situacionLote_idx`(`situacionLote`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SituacionVivienda` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `tipoVivienda` ENUM('VIVIENDA_1_PISO', 'VIVIENDA_2_PISOS', 'VIVIENDA_PRECARIA') NULL,
    `estadoConstructivo` ENUM('BUENA', 'MALA', 'ACEPTABLE') NULL,
    `materialPredominante` ENUM('LIGERA', 'SOLIDA', 'MIXTO') NULL,
    `cuentaConLuz` ENUM('MEDIDOR_PROPIO', 'CEDIDA_VECINOS', 'CONEXION_IRREGULAR_RED_PUBLICA') NULL,
    `sistemaEvacuacionAguas` ENUM('FOSA_SEPTICA', 'POZO_NEGRO', 'DERIVACION_CURSO_AGUA_SUPERFICIAL') NULL,
    `abastecimientoAguaPotable` ENUM('ALJIBE_MUNICIPAL_GOBERNACION', 'ALJIBE_PARTICULAR', 'POZO_PROPIO') NULL,
    `cantidadViviendasLote` INTEGER NULL,
    `observacionesSociales` TEXT NULL,
    `observacionesTerritoriales` TEXT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `SituacionVivienda_fichaId_key`(`fichaId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Deslinde` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `norte` VARCHAR(191) NULL,
    `sur` VARCHAR(191) NULL,
    `este` VARCHAR(191) NULL,
    `oeste` VARCHAR(191) NULL,
    `comentarios` TEXT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Deslinde_fichaId_key`(`fichaId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Documento` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `tipo` ENUM('RSH', 'CUENTA_LUZ', 'CEDULA_IDENTIDAD', 'ESCRITURA', 'RESOLUCION', 'CERTIFICADO', 'FOTO_VIVIENDA', 'FOTO_TERRENO', 'OTRO') NOT NULL,
    `nombreArchivo` VARCHAR(191) NOT NULL,
    `rutaArchivo` VARCHAR(191) NOT NULL,
    `size` INTEGER NOT NULL,
    `mimeType` VARCHAR(191) NOT NULL,
    `estado` ENUM('PENDIENTE', 'VALIDADO', 'RECHAZADO') NOT NULL DEFAULT 'PENDIENTE',
    `uploadedById` VARCHAR(191) NOT NULL,
    `validatedById` VARCHAR(191) NULL,
    `validatedAt` DATETIME(3) NULL,
    `observacionValidador` TEXT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    INDEX `Documento_fichaId_idx`(`fichaId`),
    INDEX `Documento_tipo_idx`(`tipo`),
    INDEX `Documento_estado_idx`(`estado`),
    INDEX `Documento_uploadedById_idx`(`uploadedById`),
    INDEX `Documento_validatedById_idx`(`validatedById`),
    INDEX `Documento_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Comentario` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `contenido` TEXT NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    INDEX `Comentario_fichaId_idx`(`fichaId`),
    INDEX `Comentario_userId_idx`(`userId`),
    INDEX `Comentario_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `AuditLog` (
    `id` VARCHAR(191) NOT NULL,
    `fichaId` VARCHAR(191) NULL,
    `userId` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `entity` VARCHAR(191) NOT NULL,
    `entityId` VARCHAR(191) NULL,
    `metadata` JSON NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `AuditLog_fichaId_idx`(`fichaId`),
    INDEX `AuditLog_userId_idx`(`userId`),
    INDEX `AuditLog_entity_idx`(`entity`),
    INDEX `AuditLog_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `BitacoraHito` (
    `id` VARCHAR(191) NOT NULL,
    `titulo` VARCHAR(191) NOT NULL,
    `descripcion` TEXT NULL,
    `fechaHito` DATETIME(3) NOT NULL,
    `categoria` ENUM('URBANIZACION', 'AGUA', 'ELECTRICIDAD', 'REGULARIZACION', 'JURIDICO', 'SOCIAL', 'SERVIU', 'MUNICIPALIDAD', 'DOM', 'INFRAESTRUCTURA', 'SEGURIDAD', 'AMBIENTAL', 'CATASTRO', 'GEOMENSURA', 'COMUNIDAD', 'FINANCIAMIENTO', 'EMERGENCIA') NOT NULL,
    `estado` ENUM('PENDIENTE', 'EN_PROCESO', 'FINALIZADO', 'OBSERVADO') NOT NULL DEFAULT 'PENDIENTE',
    `prioridad` ENUM('BAJA', 'MEDIA', 'ALTA', 'CRITICA') NOT NULL DEFAULT 'MEDIA',
    `organismo` VARCHAR(191) NULL,
    `ubicacion` VARCHAR(191) NULL,
    `responsable` VARCHAR(191) NULL,
    `etiquetas` JSON NOT NULL,
    `destacado` BOOLEAN NOT NULL DEFAULT false,
    `visiblePublico` BOOLEAN NOT NULL DEFAULT true,
    `createdById` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    INDEX `BitacoraHito_fechaHito_idx`(`fechaHito`),
    INDEX `BitacoraHito_categoria_idx`(`categoria`),
    INDEX `BitacoraHito_estado_idx`(`estado`),
    INDEX `BitacoraHito_prioridad_idx`(`prioridad`),
    INDEX `BitacoraHito_createdById_idx`(`createdById`),
    INDEX `BitacoraHito_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `BitacoraArchivo` (
    `id` VARCHAR(191) NOT NULL,
    `hitoId` VARCHAR(191) NOT NULL,
    `nombre` VARCHAR(191) NOT NULL,
    `ruta` VARCHAR(191) NOT NULL,
    `mimeType` VARCHAR(191) NOT NULL,
    `tamano` INTEGER NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `deletedAt` DATETIME(3) NULL,

    INDEX `BitacoraArchivo_hitoId_idx`(`hitoId`),
    INDEX `BitacoraArchivo_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `BitacoraComentario` (
    `id` VARCHAR(191) NOT NULL,
    `hitoId` VARCHAR(191) NOT NULL,
    `usuarioId` VARCHAR(191) NOT NULL,
    `comentario` TEXT NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `deletedAt` DATETIME(3) NULL,

    INDEX `BitacoraComentario_hitoId_idx`(`hitoId`),
    INDEX `BitacoraComentario_usuarioId_idx`(`usuarioId`),
    INDEX `BitacoraComentario_deletedAt_idx`(`deletedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- AddForeignKey
ALTER TABLE `User` ADD CONSTRAINT `User_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `EmpadronamientoFicha` ADD CONSTRAINT `EmpadronamientoFicha_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Ocupante` ADD CONSTRAINT `Ocupante_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `OcupanteActualLote` ADD CONSTRAINT `OcupanteActualLote_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Lote` ADD CONSTRAINT `Lote_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SituacionVivienda` ADD CONSTRAINT `SituacionVivienda_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Deslinde` ADD CONSTRAINT `Deslinde_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Documento` ADD CONSTRAINT `Documento_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Documento` ADD CONSTRAINT `Documento_uploadedById_fkey` FOREIGN KEY (`uploadedById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Documento` ADD CONSTRAINT `Documento_validatedById_fkey` FOREIGN KEY (`validatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Comentario` ADD CONSTRAINT `Comentario_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Comentario` ADD CONSTRAINT `Comentario_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `AuditLog` ADD CONSTRAINT `AuditLog_fichaId_fkey` FOREIGN KEY (`fichaId`) REFERENCES `EmpadronamientoFicha`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `AuditLog` ADD CONSTRAINT `AuditLog_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BitacoraHito` ADD CONSTRAINT `BitacoraHito_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BitacoraArchivo` ADD CONSTRAINT `BitacoraArchivo_hitoId_fkey` FOREIGN KEY (`hitoId`) REFERENCES `BitacoraHito`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BitacoraComentario` ADD CONSTRAINT `BitacoraComentario_hitoId_fkey` FOREIGN KEY (`hitoId`) REFERENCES `BitacoraHito`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BitacoraComentario` ADD CONSTRAINT `BitacoraComentario_usuarioId_fkey` FOREIGN KEY (`usuarioId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

