/**
 * Phạm vi xem / sửa lớp – chuyên đề (`events`).
 *
 * Theo cây phòng ban như mọi dữ liệu khác: Ban giám đốc thấy tất cả; quản lý / GĐKV thấy lớp do nhân viên trong nhánh của mình phụ trách
 * (lớp chưa gán người phụ trách thì thấy theo khu vực của lớp); nhân viên (kể cả chuyên môn) chỉ thấy lớp của chính mình.
 * Bộ chọn thu hẹp `session.focus` chỉ thu hẹp thêm, không mở rộng quyền.
 */
import "server-only";
import { and, eq, inArray, isNull, or, type SQL } from "drizzle-orm";
import { db } from "@/db";
import { events, users } from "@/db/schema";
import type { SessionUser } from "./auth";
import { expandTerritoryDescendants, visibleTerritoryIds, visibleUserIds } from "./rbac";
import { scopedUserIds } from "./reports";
import { isSpecialist, specialistDepartmentIds } from "./specialist";

const NULL_ID = "00000000-0000-0000-0000-000000000000";

/**
 * `view` (báo cáo): lớp do nhân viên trong nhánh mình phụ trách HOẶC lớp tổ chức tại khu vực mình phụ trách — giám đốc khu vực xem được mọi lớp
 * trong khu vực (kể cả do nhân viên chuyên môn thuộc nhánh khác dạy). `edit` (ghi / sửa / xoá): chỉ lớp do nhân viên trong nhánh mình phụ trách
 * (và lớp chưa gán người ở khu vực mình) — xem được không có nghĩa là sửa được.
 */
export async function eventScope(session: SessionUser, mode: "view" | "edit" = "view"): Promise<SQL | undefined> {
  const tenant = eq(events.tenantId, session.tenantId);
  const focus = session.focus;

  let role: SQL | undefined;
  if (session.role === "SALES") {
    role = eq(events.ownerId, session.userId);
  } else if (session.role !== "DIRECTOR") {
    const ownerIds = await visibleUserIds(session);
    const territoryIds = await visibleTerritoryIds(session);
    const byTerritory = territoryIds ? inArray(events.territoryId, territoryIds.length > 0 ? territoryIds : [NULL_ID]) : undefined;
    const byOwner = ownerIds ? inArray(events.ownerId, ownerIds.length > 0 ? ownerIds : [NULL_ID]) : undefined;
    if (!ownerIds) {
      // Quản lý chưa được gán phòng ban: lùi về phạm vi khu vực như các báo cáo khác.
      role = byTerritory;
    } else if (mode === "view") {
      role = or(byOwner, byTerritory)!;
    } else {
      role = or(byOwner, and(isNull(events.ownerId), byTerritory))!;
    }
  }

  let narrowed: SQL | undefined;
  if (focus?.type === "terr") {
    const area = await expandTerritoryDescendants(session.tenantId, [focus.id]);
    narrowed = inArray(events.territoryId, area.length > 0 ? area : [NULL_ID]);
  } else if (focus) {
    const ids = await scopedUserIds(session);
    narrowed = ids ? inArray(events.ownerId, ids.length > 0 ? ids : [NULL_ID]) : undefined;
  }
  return and(tenant, role, narrowed);
}

/** Được ghi / sửa lớp: Ban giám đốc, GĐKV, quản lý, và nhân viên chuyên môn (chỉ lớp của chính họ). */
export async function canManageEvents(session: SessionUser): Promise<boolean> {
  if (session.role !== "SALES") return true;
  const [me] = await db.select({ jobTitle: users.jobTitle, departmentId: users.departmentId }).from(users).where(eq(users.id, session.userId)).limit(1);
  return !!me && isSpecialist(me, await specialistDepartmentIds(session.tenantId));
}

/** Nhân viên được chọn làm người phụ trách lớp: trong phạm vi người xem (nhân viên chuyên môn: chỉ chính mình). */
export async function eventOwnerOptions(session: SessionUser): Promise<{ id: string; name: string }[]> {
  const base = session.role === "SALES" ? [session.userId] : await visibleUserIds(session);
  return db
    .select({ id: users.id, name: users.fullName })
    .from(users)
    .where(and(eq(users.tenantId, session.tenantId), eq(users.isActive, true), base ? inArray(users.id, base.length > 0 ? base : [NULL_ID]) : undefined))
    .orderBy(users.fullName);
}

