-- ============================================================================
-- RESET + SEED MASIVO (850 COMUNEROS)
-- Base de datos: api_asamblea
-- Objetivo:
--   1) Limpiar tablas operativas
--   2) Mantener tabla `usuarios` para no afectar login
--   3) Poblar data simulada consistente para modulos operativos
-- ============================================================================

USE `api_asamblea`;


-- --------------------------------------------------------------------------
-- 1) LIMPIEZA DE TABLAS OPERATIVAS
-- --------------------------------------------------------------------------
TRUNCATE TABLE `adjuntos_ingreso`;
TRUNCATE TABLE `asamblea_puntos_agenda`;
TRUNCATE TABLE `asistencias`;
TRUNCATE TABLE `audit_log`;
TRUNCATE TABLE `hijos`;
TRUNCATE TABLE `ingresos_extraordinarios`;
TRUNCATE TABLE `multas_empadronamiento`;
TRUNCATE TABLE `multas_inasistencia`;
TRUNCATE TABLE `pago_detalle_meses`;
TRUNCATE TABLE `pago_detalle`;
TRUNCATE TABLE `pago_meses_adelantados`;
TRUNCATE TABLE `pagos`;
TRUNCATE TABLE `transferencias_terreno`;
TRUNCATE TABLE `padrones`;
TRUNCATE TABLE `asambleas`;
TRUNCATE TABLE `comuneros`;

-- Catalogos que se reconstruyen para mantener referencia estable
TRUNCATE TABLE `conceptos_pago`;
TRUNCATE TABLE `tipo_concepto_pago`;
TRUNCATE TABLE `tipos_asamblea`;


-- --------------------------------------------------------------------------
-- 2) PARAMETROS DE SIEMBRA
-- --------------------------------------------------------------------------
SET @seed_total_comuneros = 850;
SET @seed_usuario_registrador = 1; -- Debe existir en tabla usuarios

-- --------------------------------------------------------------------------
-- 3) CATALOGOS BASE
-- --------------------------------------------------------------------------
INSERT INTO `tipo_concepto_pago` (`id`, `nombre`, `descripcion`, `estado`, `created_at`, `updated_at`)
VALUES
  (1, 'Administrativos', 'Conceptos fijos mensuales del sistema', 'activo', NOW(), NOW());

INSERT INTO `conceptos_pago` (
  `id`, `tipo_concepto_pago_id`, `nombre`, `monto`, `estado`, `obligatorio`,
  `tipo`, `permite_repeticiones`, `aplica_desde`, `descripcion`, `created_at`, `updated_at`
)
VALUES
  (1, 1, 'Administracion', 8.50, 'activo', 1, 'mensual', 0, NULL, 'Cuota mensual de administracion comunal', NOW(), NOW()),
  (2, 1, 'Vigilancia', 12.00, 'activo', 1, 'mensual', 0, NULL, 'Cuota mensual de vigilancia comunal', NOW(), NOW()),
  (4, 1, 'Fotocheck', 7.99, 'activo', 1, 'unico', 1, NULL, 'Derecho por entrega de fotocheck', NOW(), NOW()),
  (5, 1, 'Mantenimiento de areas verdes', 20.00, 'activo', 0, 'unico', 0, NULL, 'Mantenimiento de areas comunes', NOW(), NOW());

INSERT INTO `tipos_asamblea` (
  `id`, `nombre`, `monto_multa`, `genera_multa`, `estado`, `categoria`, `descripcion`, `color`, `created_at`, `updated_at`
)
VALUES
  (1, 'Asamblea Ordinaria', 35.00, 1, 'activo', 'asamblea', 'Asamblea ordinaria mensual', 'emerald', NOW(), NOW()),
  (2, 'Asamblea Extraordinaria', 50.00, 1, 'activo', 'asamblea', 'Asamblea extraordinaria', 'teal', NOW(), NOW()),
  (3, 'Faena Comunal', 0.00, 0, 'activo', 'faena', 'Trabajo comunal organizado', 'orange', NOW(), NOW());

-- --------------------------------------------------------------------------
-- 4) COMUNEROS (850)
-- --------------------------------------------------------------------------
WITH RECURSIVE `seq` AS (
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1 FROM `seq` WHERE n < @seed_total_comuneros
)
INSERT INTO `comuneros` (
  `tipo_documento`, `numero_documento`, `tipo_persona`, `nombres`, `apellidos`, `folio`,
  `comunidad`, `estado`, `telefono`, `email`, `fecha_nacimiento`, `tipo_comunero`,
  `fecha_empadronamiento`, `tiene_hijos`, `created_at`, `updated_at`
)
SELECT
  CASE
    WHEN n % 20 = 0 THEN 'carnet_extranjeria'
    ELSE 'dni'
  END AS tipo_documento,
  CASE
    WHEN n % 20 = 0 THEN LPAD(1000000000 + n, 10, '0')
    ELSE LPAD(70000000 + n, 8, '0')
  END AS numero_documento,
  'persona_natural' AS tipo_persona,
  CONCAT('NOMBRE_', LPAD(n, 4, '0')) AS nombres,
  CONCAT('APELLIDO_', LPAD(n, 4, '0')) AS apellidos,
  CONCAT('FOL-', LPAD(n, 5, '0')) AS folio,
  'Comunidad Campesina Vina Media Luna' AS comunidad,
  CASE WHEN n % 9 = 0 THEN 'inactivo' ELSE 'activo' END AS estado,
  CONCAT('9', LPAD((n * 37) % 100000000, 8, '0')) AS telefono,
  CONCAT('comunero', n, '@demo.local') AS email,
  TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (18 + (n % 45)) YEAR)) AS fecha_nacimiento,
  CASE
    WHEN n % 7 = 0 THEN 'calificado'
    WHEN n % 3 = 0 THEN 'integrado'
    ELSE 'no_empadronado'
  END AS tipo_comunero,
  CASE
    WHEN n % 7 = 0 OR n % 3 = 0 THEN TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (n % 8) YEAR))
    ELSE NULL
  END AS fecha_empadronamiento,
  CASE WHEN n % 4 = 0 THEN 1 ELSE 0 END AS tiene_hijos,
  NOW(),
  NOW()
FROM `seq`;

-- --------------------------------------------------------------------------
-- 5) HIJOS (para comuneros con tiene_hijos = 1)
-- --------------------------------------------------------------------------
INSERT INTO `hijos` (
  `comunero_id`, `nombres`, `apellidos`, `fecha_nacimiento`, `dni`, `created_at`, `updated_at`
)
SELECT
  c.id,
  CONCAT('HIJO_', LPAD(c.id, 5, '0')),
  CONCAT('FAM_', LPAD(c.id, 5, '0')),
  TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (5 + (c.id % 13)) YEAR)),
  LPAD(90000000 + c.id, 8, '0'),
  NOW(),
  NOW()
FROM `comuneros` c
WHERE c.tiene_hijos = 1;

-- --------------------------------------------------------------------------
-- 6) PADRONES (1 base por comunero + 1 adicional para subconjunto)
-- --------------------------------------------------------------------------
INSERT INTO `padrones` (
  `comunero_id`, `fecha_adquisicion`, `manzana`, `lote`, `area`, `numero_folio`,
  `observaciones`, `estado`, `fecha_registro`, `padron_origen_id`, `created_at`, `updated_at`
)
SELECT
  c.id,
  TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (1 + (c.id % 15)) YEAR)),
  CHAR(65 + (c.id % 20)),
  LPAD((c.id % 30) + 1, 2, '0'),
  ROUND(90 + (c.id % 9) * 25 + (c.id % 5) * 3, 2),
  CONCAT('PAD-', LPAD(c.id, 5, '0'), '-01'),
  CONCAT('Padron principal del comunero ', c.id),
  CASE
    WHEN c.id % 17 = 0 THEN 'transferido'
    WHEN c.id % 11 = 0 THEN 'en_proceso'
    ELSE 'vigente'
  END,
  NOW(),
  NULL,
  NOW(),
  NOW()
FROM `comuneros` c;

INSERT INTO `padrones` (
  `comunero_id`, `fecha_adquisicion`, `manzana`, `lote`, `area`, `numero_folio`,
  `observaciones`, `estado`, `fecha_registro`, `padron_origen_id`, `created_at`, `updated_at`
)
SELECT
  c.id,
  TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (2 + (c.id % 12)) YEAR)),
  CHAR(65 + ((c.id + 3) % 20)),
  LPAD((c.id % 25) + 6, 2, '0'),
  ROUND(70 + (c.id % 8) * 18, 2),
  CONCAT('PAD-', LPAD(c.id, 5, '0'), '-02'),
  'Padron secundario simulado',
  CASE WHEN c.id % 13 = 0 THEN 'en_proceso' ELSE 'vigente' END,
  NOW(),
  NULL,
  NOW(),
  NOW()
FROM `comuneros` c
WHERE c.id % 3 = 0;

-- --------------------------------------------------------------------------
-- 7) TRANSFERENCIAS (sobre padrones marcados transferidos)
-- --------------------------------------------------------------------------
INSERT INTO `transferencias_terreno` (
  `fecha`, `padron_origen_id`, `padron_destino_id`, `vendedor_id`, `comprador_id`,
  `manzana`, `lote`, `area_original`, `area_transferida`, `area_restante`,
  `observaciones`, `folio_origen`, `folio_destino`, `tipo`, `created_at`
)
SELECT
  TIMESTAMP(DATE_SUB(NOW(), INTERVAL (p.id % 600) DAY)),
  p.id,
  v.id,
  p.comunero_id,
  v.comunero_id,
  p.manzana,
  p.lote,
  p.area,
  ROUND(p.area * 0.45, 2),
  ROUND(p.area * 0.55, 2),
  CONCAT('Transferencia simulada del padron ', p.id),
  p.numero_folio,
  v.numero_folio,
  CASE WHEN p.id % 2 = 0 THEN 'venta_parcial' ELSE 'venta_total' END,
  NOW()
FROM `padrones` p
JOIN (
  SELECT
    MIN(pp.id) AS id,
    pp.comunero_id,
    MIN(pp.numero_folio) AS numero_folio
  FROM `padrones` pp
  WHERE pp.estado = 'vigente'
  GROUP BY pp.comunero_id
) v ON v.comunero_id = CASE WHEN p.comunero_id >= @seed_total_comuneros THEN 1 ELSE p.comunero_id + 1 END
WHERE p.estado = 'transferido'
LIMIT 120;

-- --------------------------------------------------------------------------
-- 8) ASAMBLEAS + AGENDA
-- --------------------------------------------------------------------------
WITH RECURSIVE `seq_asam` AS (
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1 FROM `seq_asam` WHERE n < 24
)
INSERT INTO `asambleas` (
  `fecha`, `tipo_asamblea_id`, `tipo_nombre`, `categoria`, `multa_inasistencia`, `estado`,
  `total_asistentes`, `hora_inicio`, `hora_fin`, `descripcion`, `publico_objetivo`, `created_at`, `updated_at`
)
SELECT
  TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (24 - n) MONTH), '19:00:00'),
  CASE WHEN n % 3 = 0 THEN 2 ELSE 1 END,
  CASE WHEN n % 3 = 0 THEN 'Asamblea Extraordinaria' ELSE 'Asamblea Ordinaria' END,
  'tipo_asamblea',
  CASE WHEN n % 3 = 0 THEN 50.00 ELSE 35.00 END,
  CASE WHEN n = 24 THEN 'en_curso' ELSE 'finalizada' END,
  0,
  '19:00:00',
  '21:00:00',
  CONCAT('Asamblea simulada N ', n),
  CASE
    WHEN n % 5 = 0 THEN 'integrados'
    WHEN n % 4 = 0 THEN 'calificados'
    ELSE 'ambos'
  END,
  NOW(),
  NOW()
FROM `seq_asam`;

INSERT INTO `asamblea_puntos_agenda` (`asamblea_id`, `orden`, `descripcion`)
SELECT
  a.id,
  o.orden,
  CONCAT('Punto ', o.orden, ' de la asamblea ', a.id)
FROM `asambleas` a
JOIN (
  SELECT 1 AS orden
  UNION ALL SELECT 2
  UNION ALL SELECT 3
) o;

-- --------------------------------------------------------------------------
-- 9) ASISTENCIAS (aprox 78% de asistencia en elegibles)
-- --------------------------------------------------------------------------
INSERT INTO `asistencias` (
  `asamblea_id`, `comunero_id`, `fecha`, `hora`, `metodo_registro`, `created_at`
)
SELECT
  a.id,
  c.id,
  a.fecha,
  ADDTIME(a.hora_inicio, SEC_TO_TIME((c.id % 90) * 60)),
  CASE WHEN c.id % 5 = 0 THEN 'manual' ELSE 'codigo_barras' END,
  NOW()
FROM `asambleas` a
JOIN `comuneros` c
  ON c.estado = 'activo'
 AND c.tipo_comunero <> 'no_empadronado'
 AND (
      a.publico_objetivo = 'ambos'
      OR (a.publico_objetivo = 'integrados' AND c.tipo_comunero = 'integrado')
      OR (a.publico_objetivo = 'calificados' AND c.tipo_comunero = 'calificado')
 )
WHERE MOD(c.id + a.id, 100) < 78;

UPDATE `asambleas` a
SET a.`total_asistentes` = (
  SELECT COUNT(*)
  FROM `asistencias` s
  WHERE s.asamblea_id = a.id
);

-- --------------------------------------------------------------------------
-- 10) MULTAS INASISTENCIA (para elegibles que no asistieron)
-- --------------------------------------------------------------------------
INSERT INTO `multas_inasistencia` (
  `asamblea_id`, `comunero_id`, `monto`, `estado`, `created_at`, `updated_at`
)
SELECT
  a.id,
  c.id,
  a.multa_inasistencia,
  CASE WHEN MOD(c.id + a.id, 11) = 0 THEN 'pagado' ELSE 'pendiente' END,
  NOW(),
  NOW()
FROM `asambleas` a
JOIN `comuneros` c
  ON c.estado = 'activo'
 AND c.tipo_comunero <> 'no_empadronado'
 AND (
      a.publico_objetivo = 'ambos'
      OR (a.publico_objetivo = 'integrados' AND c.tipo_comunero = 'integrado')
      OR (a.publico_objetivo = 'calificados' AND c.tipo_comunero = 'calificado')
 )
LEFT JOIN `asistencias` s
  ON s.asamblea_id = a.id
 AND s.comunero_id = c.id
WHERE s.id IS NULL
  AND a.estado = 'finalizada';

UPDATE `multas_inasistencia` mi
JOIN `asambleas` a ON a.id = mi.asamblea_id
SET mi.fecha_pago = DATE_ADD(a.fecha, INTERVAL 7 DAY)
WHERE mi.estado = 'pagado';

-- --------------------------------------------------------------------------
-- 11) MULTAS EMPADRONAMIENTO (solo no empadronados activos)
-- --------------------------------------------------------------------------
INSERT INTO `multas_empadronamiento` (
  `comunero_id`, `anio_empadronamiento`, `monto`, `fecha_generacion`, `estado`, `created_at`, `updated_at`
)
SELECT
  c.id,
  y.anio,
  50.00,
  TIMESTAMP(CONCAT(y.anio, '-12-15 00:00:00')),
  CASE WHEN MOD(c.id + y.anio, 9) = 0 THEN 'pagado' ELSE 'pendiente' END,
  NOW(),
  NOW()
FROM `comuneros` c
JOIN (
  SELECT YEAR(CURDATE()) - 1 AS anio
  UNION ALL
  SELECT YEAR(CURDATE()) AS anio
) y
WHERE c.tipo_comunero = 'no_empadronado'
  AND c.estado = 'activo';

UPDATE `multas_empadronamiento`
SET
  `fecha_pago` = DATE_ADD(`fecha_generacion`, INTERVAL 20 DAY),
  `numero_recibo` = CONCAT('ME-', LPAD(`id`, 6, '0'))
WHERE `estado` = 'pagado';

-- --------------------------------------------------------------------------
-- 12) PAGOS + DETALLES + MESES
-- --------------------------------------------------------------------------
WITH RECURSIVE `seq_mes` AS (
  SELECT 0 AS n
  UNION ALL
  SELECT n + 1 FROM `seq_mes` WHERE n < 5
)
INSERT INTO `pagos` (
  `comunero_id`, `fecha`, `hora`, `mes_principal`, `total`, `medio_pago`, `numero_recibo`,
  `voucher_digital_url`, `voucher_digital_nombre`, `observaciones`, `registrado_por`, `created_at`, `updated_at`
)
SELECT
  c.id,
  DATE_ADD(
    TIMESTAMP(DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL m.n MONTH), '%Y-%m-01'), '09:00:00'),
    INTERVAL (c.id % 25) DAY
  ),
  ADDTIME('09:00:00', SEC_TO_TIME((c.id % 240) * 60)),
  DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL m.n MONTH), '%Y-%m'),
  CASE WHEN MOD(c.id + m.n, 5) = 0 THEN 40.50 ELSE 20.50 END,
  CASE WHEN MOD(c.id + m.n, 4) = 0 THEN 'Yape/Plin' ELSE 'Efectivo' END,
  CONCAT('P', DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL m.n MONTH), '%y%m'), LPAD(c.id, 5, '0')),
  NULL,
  NULL,
  'Pago simulado masivo',
  @seed_usuario_registrador,
  NOW(),
  NOW()
FROM `comuneros` c
JOIN `seq_mes` m
WHERE c.estado = 'activo'
  AND c.tipo_comunero IN ('integrado', 'calificado')
  AND MOD(c.id + m.n, 100) < 70;

INSERT INTO `pago_detalle` (
  `pago_id`, `concepto_pago_id`, `concepto_nombre`, `monto`, `cantidad`, `subtotal`, `observacion`, `created_at`, `updated_at`
)
SELECT
  p.id, 1, 'Administracion', 8.50, 1, 8.50, NULL, NOW(), NOW()
FROM `pagos` p;

INSERT INTO `pago_detalle` (
  `pago_id`, `concepto_pago_id`, `concepto_nombre`, `monto`, `cantidad`, `subtotal`, `observacion`, `created_at`, `updated_at`
)
SELECT
  p.id, 2, 'Vigilancia', 12.00, 1, 12.00, NULL, NOW(), NOW()
FROM `pagos` p;

INSERT INTO `pago_detalle` (
  `pago_id`, `concepto_pago_id`, `concepto_nombre`, `monto`, `cantidad`, `subtotal`, `observacion`, `created_at`, `updated_at`
)
SELECT
  p.id, 5, 'Mantenimiento de areas verdes', 20.00, 1, 20.00, 'Concepto adicional simulado', NOW(), NOW()
FROM `pagos` p
WHERE p.total > 20.50;

INSERT INTO `pago_detalle_meses` (`pago_detalle_id`, `mes`, `created_at`, `updated_at`)
SELECT
  d.id,
  p.mes_principal,
  NOW(),
  NOW()
FROM `pago_detalle` d
JOIN `pagos` p ON p.id = d.pago_id
WHERE d.concepto_pago_id IN (1, 2, 5);

INSERT INTO `pago_meses_adelantados` (`pago_id`, `mes`)
SELECT
  p.id,
  DATE_FORMAT(
    DATE_ADD(STR_TO_DATE(CONCAT(p.mes_principal, '-01'), '%Y-%m-%d'), INTERVAL 1 MONTH),
    '%Y-%m'
  )
FROM `pagos` p
WHERE MOD(p.id, 17) = 0;

-- --------------------------------------------------------------------------
-- 13) INGRESOS EXTRAORDINARIOS + ADJUNTOS
-- --------------------------------------------------------------------------
WITH RECURSIVE `seq_ing` AS (
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1 FROM `seq_ing` WHERE n < 120
)
INSERT INTO `ingresos_extraordinarios` (
  `fecha`, `tipo_aportante`, `aportante_nombre`, `aportante_detalle`, `concepto`,
  `monto`, `observaciones`, `registrado_por`, `created_at`
)
SELECT
  TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL (n % 365) DAY)),
  CASE
    WHEN n % 3 = 0 THEN 'empresa'
    WHEN n % 3 = 1 THEN 'comunero'
    ELSE 'otro'
  END,
  CASE
    WHEN n % 3 = 0 THEN CONCAT('Empresa Demo ', LPAD(n, 3, '0'))
    WHEN n % 3 = 1 THEN CONCAT('Aportante Comunero ', LPAD(n, 3, '0'))
    ELSE CONCAT('Aportante Externo ', LPAD(n, 3, '0'))
  END,
  CASE
    WHEN n % 3 = 0 THEN LPAD(20000000000 + n, 11, '0')
    WHEN n % 3 = 1 THEN LPAD(70000000 + (n % 850), 8, '0')
    ELSE CONCAT('Ref-', LPAD(n, 4, '0'))
  END,
  CONCAT('Ingreso extraordinario simulado #', LPAD(n, 4, '0')),
  ROUND(120 + (n % 25) * 35.5, 2),
  'Registro de ingreso generado automaticamente',
  @seed_usuario_registrador,
  NOW()
FROM `seq_ing`;

INSERT INTO `adjuntos_ingreso` (
  `ingreso_id`, `nombre`, `tipo`, `tamanio`, `url`, `fecha_subida`, `created_at`
)
SELECT
  i.id,
  CONCAT('adjunto_', i.id, '.pdf'),
  'pdf',
  245000,
  CONCAT('/storage/ingresos/adjunto_', i.id, '.pdf'),
  i.fecha,
  NOW()
FROM `ingresos_extraordinarios` i
WHERE MOD(i.id, 5) = 0;

-- --------------------------------------------------------------------------
-- 14) AJUSTE FINAL
-- --------------------------------------------------------------------------

SELECT
  (SELECT COUNT(*) FROM `comuneros`)                AS total_comuneros,
  (SELECT COUNT(*) FROM `padrones`)                 AS total_padrones,
  (SELECT COUNT(*) FROM `transferencias_terreno`)   AS total_transferencias,
  (SELECT COUNT(*) FROM `asambleas`)                AS total_asambleas,
  (SELECT COUNT(*) FROM `asistencias`)              AS total_asistencias,
  (SELECT COUNT(*) FROM `multas_inasistencia`)      AS total_multas_inasistencia,
  (SELECT COUNT(*) FROM `multas_empadronamiento`)   AS total_multas_empadronamiento,
  (SELECT COUNT(*) FROM `pagos`)                    AS total_pagos,
  (SELECT COUNT(*) FROM `ingresos_extraordinarios`) AS total_ingresos_extraordinarios;
