/**
 * Dev-only seeded users — single source of truth for demo login credentials.
 * Used by dev-api-mock, admin-auth, and the /login hub page.
 */

import {
  DASHBOARD_MOCKUP_PERSONAS,
  DASHBOARD_PERSONA_IDS,
  type DashboardPersonaKey,
} from "@/lib/fixtures/dashboard-mockup-personas";
import type { AdminOfficer, AdminPermission } from "@/lib/admin-types";

export const DEV_OTP_CODE = "1234";
export const DEV_PASSWORD = "dev123";

export type DevUserKind = "farmer" | "agnet_officer" | "bank_officer";

export interface DevFarmerCredential {
  kind: "farmer";
  key: DashboardPersonaKey;
  userId: string;
  phone: string;
  name: string;
  module: "identity" | "finance" | "inputs";
  description: string;
  otp: string;
}

export interface DevOfficerCredential {
  kind: "agnet_officer" | "bank_officer";
  officer: AdminOfficer;
  password: string;
  description: string;
  loginPath: string;
}

export type DevCredential = DevFarmerCredential | DevOfficerCredential;

const PERMISSIONS_BY_ROLE: Record<AdminOfficer["role"], AdminPermission[]> = {
  officer: ["cases:read", "cases:review"],
  supervisor: ["cases:read", "cases:review", "scoring:override"],
  bank_officer: ["cases:read", "cases:review", "cases:institution_only"],
};

function officer(
  id: string,
  email: string,
  name: string,
  role: AdminOfficer["role"],
  institutionId?: string,
): AdminOfficer {
  return {
    id,
    email,
    name,
    role,
    institutionId,
    permissions: PERMISSIONS_BY_ROLE[role],
  };
}

export const DEV_FARMER_CREDENTIALS: DevFarmerCredential[] = [
  {
    kind: "farmer",
    key: "islomjon",
    userId: DASHBOARD_PERSONA_IDS.islomjon,
    phone: DASHBOARD_MOCKUP_PERSONAS.islomjon.phone,
    name: DASHBOARD_MOCKUP_PERSONAS.islomjon.identity?.fullName ?? "Islomjon Abdullaev",
    module: "identity",
    description: "Full identity dashboard — GIS, eKYC, compliance, yield history",
    otp: DEV_OTP_CODE,
  },
  {
    kind: "farmer",
    key: "agrobankCase",
    userId: DASHBOARD_PERSONA_IDS.agrobankCase,
    phone: DASHBOARD_MOCKUP_PERSONAS.agrobankCase.phone,
    name: DASHBOARD_MOCKUP_PERSONAS.agrobankCase.identity?.fullName ?? "Islomjon Abdullaev",
    module: "finance",
    description: "AGNET Finance dashboard — case UZB-2024-05-000789, Agrobank routing, approval path",
    otp: DEV_OTP_CODE,
  },
  {
    kind: "farmer",
    key: "burkinaInputs",
    userId: DASHBOARD_PERSONA_IDS.burkinaInputs,
    phone: DASHBOARD_MOCKUP_PERSONAS.burkinaInputs.phone,
    name: DASHBOARD_MOCKUP_PERSONAS.burkinaInputs.identity?.fullName ?? "Amadou Diallo",
    module: "inputs",
    description: "Inputs & supply chain — catalog, voucher, delivery tracking",
    otp: DEV_OTP_CODE,
  },
];

export const DEV_OFFICER_CREDENTIALS: DevOfficerCredential[] = [
  {
    kind: "agnet_officer",
    officer: officer("officer-dev-001", "officer@agnet.uz", "Dev Officer", "officer"),
    password: DEV_PASSWORD,
    description: "AGNET case reviewer — full national queue",
    loginPath: "/admin/login",
  },
  {
    kind: "agnet_officer",
    officer: officer("supervisor-dev-001", "supervisor@agnet.uz", "Dev Supervisor", "supervisor"),
    password: DEV_PASSWORD,
    description: "AGNET supervisor — all cases plus scoring override",
    loginPath: "/admin/login",
  },
  {
    kind: "bank_officer",
    officer: officer(
      "bank-agrobank-001",
      "bank@agrobank.uz",
      "Agrobank Loan Officer",
      "bank_officer",
      "inst-uz-agrobank-001",
    ),
    password: DEV_PASSWORD,
    description: "Institution portal — cases routed to Agrobank only",
    loginPath: "/admin/login",
  },
];

export const DEV_CREDENTIALS: DevCredential[] = [
  ...DEV_FARMER_CREDENTIALS,
  ...DEV_OFFICER_CREDENTIALS,
];

export function findFarmerCredentialByPhone(phone: string): DevFarmerCredential | undefined {
  const normalized = phone.replace(/\s/g, "");
  return DEV_FARMER_CREDENTIALS.find(
    (c) => c.phone.replace(/\s/g, "") === normalized || c.phone.endsWith(normalized.slice(-9)),
  );
}

export function findOfficerByEmail(email: string): AdminOfficer | undefined {
  const cred = DEV_OFFICER_CREDENTIALS.find(
    (c) => c.officer.email.toLowerCase() === email.toLowerCase(),
  );
  return cred?.officer;
}

export function verifyDevOfficerPassword(email: string, password: string): boolean {
  const cred = DEV_OFFICER_CREDENTIALS.find(
    (c) => c.officer.email.toLowerCase() === email.toLowerCase(),
  );
  return cred != null && cred.password === password;
}

export function officerCanAccessCase(
  officer: AdminOfficer,
  preferredInstitution?: string | null,
): boolean {
  if (!officer.permissions.includes("cases:institution_only")) return true;
  if (!officer.institutionId) return false;
  return preferredInstitution === officer.institutionId || preferredInstitution === "agrobank";
}

export function isDevLoginHubEnabled(): boolean {
  return process.env.NODE_ENV !== "production" || process.env.CORE_API_USE_MOCK === "true";
}
