"use client";

import * as React from "react";

import { SalesTargetsBody } from "@/components/sales-targets/sales-targets-body";
import {
  parseNum,
  resolveTeamCombinedTarget,
  type SalesTargetMemberRow,
  type TeamRowState,
} from "@/components/sales-targets/sales-targets-helpers";
import type { TeamAeAttainment } from "@/api/rtk/sales-targets-api";
import type { PermissionSource } from "@/lib/permissions";
import type { Team } from "@/api/rtk/teams-api";
import type { SalesTargetsSummaryData } from "@/components/sales-targets/sales-targets-summary";

type Attainment = {
  attained: number;
  pct: number | null;
  target: number | null;
};

function buildSummary(
  teamRows: TeamRowState[],
  attainmentByTeam: Map<string, Attainment>,
  membersByTeam: Map<string, SalesTargetMemberRow[]>,
): SalesTargetsSummaryData {
  let totalTarget = 0;
  let totalAttained = 0;
  let teamsWithTarget = 0;
  let pctSum = 0;
  let pctCount = 0;

  for (const row of teamRows) {
    const att = attainmentByTeam.get(row.teamId);
    const teamTarget = resolveTeamCombinedTarget({
      attainmentTarget: att?.target,
      members: membersByTeam.get(row.teamId),
      aeTargetFromRow: parseNum(row.aeTarget) ?? null,
    });
    if (teamTarget != null && teamTarget > 0) {
      totalTarget += teamTarget;
      teamsWithTarget += 1;
    }
    if (att?.attained != null) totalAttained += att.attained;
    if (att?.pct != null && !Number.isNaN(att.pct)) {
      pctSum += att.pct;
      pctCount += 1;
    }
  }

  return {
    teamCount: teamRows.length,
    teamsWithTarget,
    totalTarget,
    totalAttained,
    avgPct: pctCount > 0 ? pctSum / pctCount : null,
  };
}

type SalesTargetsAdminPanelProps = {
  monthLabel: string;
  overviewTeamRows: TeamRowState[];
  attainmentByTeam: Map<string, Attainment>;
  membersByTeam: Map<string, SalesTargetMemberRow[]>;
  membersLoading?: boolean;
  summaryLoading?: boolean;
  permissionSource: PermissionSource;
  allTeams: Team[];
  canAssignReps: boolean;
  onAssignTeam: (teamId: string) => void;
  teamFilterId: string;
  onTeamFilterChange: (teamId: string) => void;
  attainmentTeams?: TeamAeAttainment[];
  attainmentLoading?: boolean;
  periodYear: number;
  periodMonth: number;
};

export function SalesTargetsAdminPanel({
  monthLabel,
  overviewTeamRows,
  attainmentByTeam,
  membersByTeam,
  membersLoading,
  summaryLoading,
  permissionSource,
  allTeams,
  canAssignReps,
  onAssignTeam,
  teamFilterId,
  onTeamFilterChange,
  attainmentTeams = [],
  attainmentLoading,
  periodYear,
  periodMonth,
}: SalesTargetsAdminPanelProps) {
  /** Org-wide KPIs — not scoped to the header team filter (see overview table for per-team rows). */
  const summary = React.useMemo(
    () => buildSummary(overviewTeamRows, attainmentByTeam, membersByTeam),
    [overviewTeamRows, attainmentByTeam, membersByTeam],
  );

  const teamLeadUserIdsByTeam = React.useMemo(() => {
    const map = new Map<string, Set<string>>();
    for (const t of allTeams) {
      const ids = new Set<string>();
      const leadUserId = t.teamLead?.userId?.trim();
      if (leadUserId) ids.add(leadUserId);
      const ownerId = (t.ownerId ?? t.lead)?.trim();
      if (ownerId) ids.add(ownerId);
      map.set(t.id, ids);
    }
    return map;
  }, [allTeams]);



  return (
    <SalesTargetsBody
      scopeToLedTeamsOnly={false}
      monthLabel={monthLabel}
      summary={summary}
      summaryLoading={summaryLoading}
      overviewTeamRows={overviewTeamRows}
      attainmentByTeam={attainmentByTeam}
      membersByTeam={membersByTeam}
      membersLoading={membersLoading}
      permissionSource={permissionSource}
      allTeams={allTeams}
      canAssignReps={canAssignReps}
      onAssignTeam={onAssignTeam}
      teamFilterId={teamFilterId}
      onTeamFilterChange={onTeamFilterChange}
      teamLeadUserIdsByTeam={teamLeadUserIdsByTeam}

      periodYear={periodYear}
      periodMonth={periodMonth}
    />
  );
}
