import { NextRequest, NextResponse } from "next/server";
import { verifyCredentials } from "@/lib/auth";
import { verifyMomoCredentials } from "@/lib/momo-auth";
import { createSession } from "@/lib/session";
import type { User } from "@/types";

export async function POST(request: NextRequest) {
  const body = await request.json();
  const { userId, password, remember } = body as { userId?: string; password?: string; remember?: boolean };
  const keepLoggedIn = !!remember;

  if (!userId || !password) {
    return NextResponse.json(
      { success: false, message: "아이디와 비밀번호를 입력하세요." },
      { status: 400 }
    );
  }

  // 이메일 형태이면 MOMO 사용자 우선 시도, 그 외에는 FITO 우선 시도
  const looksLikeEmail = /@/.test(userId);

  // 모든 사용자 첫 진입은 출고 요청 화면으로 (관리자도 동일).
  // 관리자는 좌측 메뉴에서 [출고/정산] 등으로 이동.
  const landingFor = (_u: User): string => "/m/orders/new";

  if (looksLikeEmail) {
    const momo = await verifyMomoCredentials(userId, password);
    if (momo.success && momo.user) {
      const sessionUser: User = momoToSessionUser(momo.user);
      await createSession(sessionUser, keepLoggedIn);
      return NextResponse.json({ success: true, user: sessionUser, redirectTo: landingFor(sessionUser) });
    }
    // MOMO 실패 시 FITO 폴백 시도 (관리자 마이그레이션 케이스)
  }

  const fito = await verifyCredentials(userId, password);
  if (fito.success && fito.user) {
    await createSession(fito.user, keepLoggedIn);
    return NextResponse.json({ success: true, user: fito.user, redirectTo: landingFor(fito.user) });
  }

  // FITO 도 실패하면 MOMO를 한 번 더 시도 (이메일 형태가 아니지만 MOMO 계정인 경우)
  if (!looksLikeEmail) {
    const momo = await verifyMomoCredentials(userId, password);
    if (momo.success && momo.user) {
      const sessionUser: User = momoToSessionUser(momo.user);
      await createSession(sessionUser, keepLoggedIn);
      return NextResponse.json({ success: true, user: sessionUser, redirectTo: landingFor(sessionUser) });
    }
  }

  return NextResponse.json(
    { success: false, message: fito.error || "아이디 또는 비밀번호를 확인하세요." },
    { status: 401 }
  );
}

function momoToSessionUser(u: {
  objid: string;
  email: string;
  companyName: string;
  phone: string;
  role: "USER" | "ADMIN";
  isAdmin: boolean;
}): User {
  return {
    sabun: "",
    userId: u.email,
    userName: u.companyName,
    userNameEng: "",
    userNameCn: "",
    deptCode: "",
    deptName: "",
    positionCode: "",
    positionName: "",
    email: u.email,
    tel: "",
    cellPhone: u.phone,
    userType: "MOMO",
    userTypeName: u.role === "ADMIN" ? "관리자" : "거래처",
    authName: u.role,
    partnerCd: "",
    isAdmin: u.isAdmin,
    role: u.role,
    objid: u.objid,
    companyName: u.companyName,
  };
}
