<?php
/**
 * ============================================================
 *  DEPARTAMENTOS, CO-PROPIETARIOS Y DISPONIBILIDAD
 *
 *  Un departamento puede tener varios propietarios (por ejemplo
 *  un matrimonio): son simplemente varias filas en `propietarios`
 *  con el MISMO numero_departamento. Todos ven los mismos
 *  arriendos y todos reciben los avisos por correo.
 * ============================================================
 */

/** Departamento (y datos) del propietario que tiene la sesión abierta. */
function departamento_de_usuario(mysqli $conn, int $id_usuario) {
    $stmt = $conn->prepare("SELECT id_propietario, numero_departamento, estacionamiento
                            FROM propietarios WHERE id_usuario = ? LIMIT 1");
    $stmt->bind_param('i', $id_usuario);
    $stmt->execute();
    return $stmt->get_result()->fetch_assoc() ?: null;
}

/**
 * Todos los id_propietario del mismo departamento (el propio y los de
 * su cónyuge/copropietarios). Se usa para que ambos vean los arriendos.
 */
function ids_propietarios_departamento(mysqli $conn, string $numero_departamento): array {
    $stmt = $conn->prepare("SELECT id_propietario FROM propietarios WHERE numero_departamento = ?");
    $stmt->bind_param('s', $numero_departamento);
    $stmt->execute();
    $res = $stmt->get_result();

    $ids = [];
    while ($r = $res->fetch_assoc()) {
        $ids[] = (int)$r['id_propietario'];
    }
    return $ids ?: [0]; // [0] evita un IN () vacío
}

/**
 * Correos de todos los propietarios de un departamento.
 * Devuelve [['nombre'=>..., 'email'=>...], ...] sin repetidos.
 */
function correos_propietarios_departamento(mysqli $conn, string $numero_departamento): array {
    $stmt = $conn->prepare("
        SELECT DISTINCT u.nombre, u.email
        FROM propietarios p
        JOIN usuarios u ON u.id_usuario = p.id_usuario
        WHERE p.numero_departamento = ?
          AND u.email <> ''
          AND u.estado = 'activo'");
    $stmt->bind_param('s', $numero_departamento);
    $stmt->execute();
    $res = $stmt->get_result();

    $lista = [];
    while ($r = $res->fetch_assoc()) {
        $lista[strtolower($r['email'])] = $r;
    }
    return array_values($lista);
}

/** Cláusula "IN (?,?,?)" lista para usar con los ids de un departamento. */
function sql_in_propietarios(array $ids): string {
    return implode(',', array_map('intval', $ids));
}

/* ============================================================
   DISPONIBILIDAD
============================================================ */

/**
 * Busca un arriendo YA CONFIRMADO que choque con el rango pedido.
 *
 * Se comparan fecha + hora juntas, así que un mismo día puede tener
 * dos arriendos distintos: si uno sale a las 12:00, el siguiente
 * puede entrar desde las 12:00 en adelante (los bordes que se tocan
 * NO se consideran choque).
 *
 * Devuelve el arriendo en conflicto, o false si está libre.
 */
function arriendo_en_conflicto(
    mysqli $conn,
    string $numero_departamento,
    string $fecha_inicio, string $hora_ingreso,
    string $fecha_salida, string $hora_salida,
    int $excluir_id_arrendatario = 0
) {
    $ids = sql_in_propietarios(ids_propietarios_departamento($conn, $numero_departamento));

    $inicio = $fecha_inicio . ' ' . $hora_ingreso;
    $fin    = $fecha_salida . ' ' . $hora_salida;

    $sql = "SELECT a.id_arrendatario, a.nombre, a.fecha_inicio, a.fecha_salida,
                   a.hora_ingreso, a.hora_salida
            FROM arrendatarios a
            WHERE a.id_propietario IN ($ids)
              AND a.id_arrendatario <> ?
              AND TIMESTAMP(a.fecha_inicio, a.hora_ingreso) < ?
              AND TIMESTAMP(a.fecha_salida, a.hora_salida)  > ?
            ORDER BY a.fecha_inicio
            LIMIT 1";

    $stmt = $conn->prepare($sql);
    $stmt->bind_param('iss', $excluir_id_arrendatario, $fin, $inicio);
    $stmt->execute();
    return $stmt->get_result()->fetch_assoc() ?: false;
}

/**
 * Igual que la anterior, pero mirando las solicitudes ya ACEPTADAS
 * que todavía no se convirtieron en arriendo. Evita aceptar dos
 * solicitudes que se pisan entre sí.
 */
function solicitud_en_conflicto(
    mysqli $conn,
    string $numero_departamento,
    string $fecha_inicio, string $hora_ingreso,
    string $fecha_salida, string $hora_salida,
    int $excluir_id_solicitud = 0
) {
    $inicio = $fecha_inicio . ' ' . $hora_ingreso;
    $fin    = $fecha_salida . ' ' . $hora_salida;

    $stmt = $conn->prepare("
        SELECT id_solicitud, nombre, fecha_inicio, fecha_salida, hora_ingreso, hora_salida
        FROM solicitudes
        WHERE numero_departamento = ?
          AND estado = 'aceptada'
          AND id_arrendatario IS NULL
          AND id_solicitud <> ?
          AND TIMESTAMP(fecha_inicio, hora_ingreso) < ?
          AND TIMESTAMP(fecha_salida, hora_salida)  > ?
        LIMIT 1");
    $stmt->bind_param('siss', $numero_departamento, $excluir_id_solicitud, $fin, $inicio);
    $stmt->execute();
    return $stmt->get_result()->fetch_assoc() ?: false;
}

/** Texto legible de un rango de arriendo, para mostrar en avisos. */
function texto_rango($fila): string {
    return fecha_cl($fila['fecha_inicio']) . ' ' . hora_cl($fila['hora_ingreso'])
         . ' → ' . fecha_cl($fila['fecha_salida']) . ' ' . hora_cl($fila['hora_salida']);
}
