<?php
declare(strict_types=1);

require_once __DIR__ . '/../auth/guard.php';
require_once __DIR__ . '/../conexion.php';
require_once __DIR__ . '/../_helpers.php';

$u = require_login();
require_module_write($u, "vivienda");
$rut = $u['rut'] ?? null;

if (!function_exists('respond')) {
  function respond(array $payload, int $code = 200): void { json_response($payload, $code); }
}
if (!function_exists('respond_error')) {
  function respond_error(string $msg, int $code = 400): void { json_response(['ok'=>false,'message'=>$msg], $code); }
}

$raw = file_get_contents('php://input');
$body = json_decode($raw ?: '[]', true);
if (!is_array($body)) $body = [];

$id = (string)($body['id'] ?? '');
$cod = trim((string)($body['cod_vivienda'] ?? ''));

$direccion = trim((string)($body['direccion'] ?? ''));
$sectorizacion = ($body['sectorizacion'] ?? null);
$sector = ($body['sector'] ?? null);
$latitud = ($body['latitud'] ?? null);
$longitud = ($body['longitud'] ?? null);

$tipo = trim((string)($body['tipo_vivienda'] ?? ''));
$tenencia = trim((string)($body['tenencia'] ?? ''));
$conservacion = trim((string)($body['conservacion'] ?? ''));
$calefaccion = trim((string)($body['calefaccion'] ?? ''));

$np = ($body['numero_piezas'] ?? null);
$nd = ($body['numero_dormitorios'] ?? null);
$nc = ($body['numero_camas'] ?? null);

$cond = $body['condiciones'] ?? [];
if (!is_array($cond)) $cond = [];

$familias = $body['familias'] ?? [];
if (!is_array($familias)) $familias = [];

try {
  $pdo->beginTransaction();

  // generar código si viene vacío
  if ($cod === '') {
    $year = (int)date('Y');
    $prefix = "VIV-$year-";
    $pos = strlen($prefix) + 1;

    $stMax = $pdo->prepare("
      SELECT MAX(CAST(SUBSTRING(cod_vivienda, :pos) AS UNSIGNED)) AS max_n
      FROM vivienda
      WHERE cod_vivienda LIKE :pref
    ");
    $stMax->execute([':pos'=>$pos, ':pref'=>$prefix.'%']);
    $max = (int)($stMax->fetchColumn() ?? 0);
    $cod = $prefix . str_pad((string)($max + 1), 4, '0', STR_PAD_LEFT);
  }

  // upsert vivienda
  if ($id !== '') {
    $stU = $pdo->prepare("
      UPDATE vivienda SET
        cod_vivienda = :cod,
        direccion = :direccion,
        sectorizacion = :sz,
        sector = :sc,
        latitud = :lat,
        longitud = :lng,
        tipo_vivienda = :tipo,
        tenencia = :ten,
        conservacion = :cons,
        calefaccion = :cal,
        numero_piezas = :np,
        numero_dormitorios = :nd,
        numero_camas = :nc,
        registrado_por = :rut
      WHERE id = :id
    ");
    $stU->execute([
      ':cod'=>$cod,
      ':direccion'=>$direccion ?: null,
      ':sz'=>($sectorizacion === '' ? null : $sectorizacion),
      ':sc'=>($sector === '' ? null : $sector),
      ':lat'=>($latitud === '' ? null : $latitud),
      ':lng'=>($longitud === '' ? null : $longitud),
      ':tipo'=>$tipo ?: null,
      ':ten'=>$tenencia ?: null,
      ':cons'=>$conservacion ?: null,
      ':cal'=>$calefaccion ?: null,
      ':np'=>($np === '' ? null : $np),
      ':nd'=>($nd === '' ? null : $nd),
      ':nc'=>($nc === '' ? null : $nc),
      ':rut'=>$rut,
      ':id'=>$id
    ]);
    $vid = (int)$id;
  } else {
    $stI = $pdo->prepare("
      INSERT INTO vivienda
      (cod_vivienda, direccion, sectorizacion, sector, latitud, longitud,
       tipo_vivienda, tenencia, conservacion, calefaccion,
       numero_piezas, numero_dormitorios, numero_camas, registrado_por)
      VALUES
      (:cod, :direccion, :sz, :sc, :lat, :lng,
       :tipo, :ten, :cons, :cal,
       :np, :nd, :nc, :rut)
    ");
    $stI->execute([
      ':cod'=>$cod,
      ':direccion'=>$direccion ?: null,
      ':sz'=>($sectorizacion === '' ? null : $sectorizacion),
      ':sc'=>($sector === '' ? null : $sector),
      ':lat'=>($latitud === '' ? null : $latitud),
      ':lng'=>($longitud === '' ? null : $longitud),
      ':tipo'=>$tipo ?: null,
      ':ten'=>$tenencia ?: null,
      ':cons'=>$conservacion ?: null,
      ':cal'=>$calefaccion ?: null,
      ':np'=>($np === '' ? null : $np),
      ':nd'=>($nd === '' ? null : $nd),
      ':nc'=>($nc === '' ? null : $nc),
      ':rut'=>$rut
    ]);
    $vid = (int)$pdo->lastInsertId();
  }

  // condiciones (1 fila por vivienda)
  $stE = $pdo->prepare("SELECT id FROM condiciones_vivienda WHERE id_vivienda = :id LIMIT 1");
  $stE->execute([':id'=>$vid]);
  $exists = $stE->fetchColumn();

  $agua = $cond['agua'] ?? null;
  $luz  = $cond['luz'] ?? null;
  $coc  = $cond['cocina'] ?? null;
  $dep  = $cond['deposicion'] ?? null;
  $bas  = $cond['basuras'] ?? null;
  $ani  = $cond['animales_vectores'] ?? null;

  if ($exists) {
    $stC = $pdo->prepare("
      UPDATE condiciones_vivienda SET
        agua = :agua,
        luz = :luz,
        cocina = :coc,
        deposicion = :dep,
        basuras = :bas,
        animales_vectores = :ani,
        registrado_por = :rut
      WHERE id_vivienda = :id
    ");
    $stC->execute([
      ':agua'=>$agua, ':luz'=>$luz, ':coc'=>$coc, ':dep'=>$dep, ':bas'=>$bas, ':ani'=>$ani,
      ':rut'=>$rut, ':id'=>$vid
    ]);
  } else {
    $stC = $pdo->prepare("
      INSERT INTO condiciones_vivienda
      (id_vivienda, agua, luz, cocina, deposicion, basuras, animales_vectores, registrado_por)
      VALUES
      (:id, :agua, :luz, :coc, :dep, :bas, :ani, :rut)
    ");
    $stC->execute([
      ':id'=>$vid,
      ':agua'=>$agua, ':luz'=>$luz, ':coc'=>$coc, ':dep'=>$dep, ':bas'=>$bas, ':ani'=>$ani,
      ':rut'=>$rut
    ]);
  }

  // familias (chips) - tabla puente si existe
  $codes = [];
  foreach ($familias as $f) {
    if (is_array($f)) {
      $c = trim((string)($f['codigo'] ?? ''));
      if ($c !== '') $codes[] = $c;
    }
  }
  $codes = array_values(array_unique($codes));

  $usedBridge = false;
  try {
    // limpiamos y volvemos a insertar
    $pdo->prepare("DELETE FROM vivienda_familias WHERE id_vivienda = :id")->execute([':id'=>$vid]);
    if ($codes) {
      $stF = $pdo->prepare("
        INSERT INTO vivienda_familias (id_vivienda, codigo_familia, registrado_por)
        VALUES (:id, :cod, :rut)
      ");
      foreach ($codes as $c) {
        $stF->execute([':id'=>$vid, ':cod'=>$c, ':rut'=>$rut]);
      }
    }
    $usedBridge = true;
  } catch (Throwable $e) {
    // fallback si no existe la tabla puente: guardar solo la primera en vivienda.codigo_familia
  }

  if (!$usedBridge) {
    $first = $codes[0] ?? null;
    $pdo->prepare("UPDATE vivienda SET codigo_familia = :cf WHERE id = :id")
        ->execute([':cf'=>$first, ':id'=>$vid]);
  }

  $pdo->commit();

  fp_log_activity($pdo, $u, 'Vivienda', 'Guardar vivienda', 'Se guardó/actualizó la vivienda código ' . $cod, 'vivienda', (string)$vid);

  respond([
    'ok' => true,
    'message' => 'Vivienda guardada',
    'data' => [
      'id' => $vid,
      'cod_vivienda' => $cod
    ]
  ]);

} catch (Throwable $e) {
  if ($pdo->inTransaction()) $pdo->rollBack();
  error_log("VIVIENDA save ERROR: ".$e->getMessage());
  respond_error("Error de servidor", 500);
}
