'use server'

// ===== Enums =====
// لا توجد تعدادات مخصصة لهذه الصفحة، سيتم استخدام UserRole من action_utils

// ===== Data Structures =====
// لا توجد هياكل بيانات معقدة أو قوائم لهذه الصفحة

// ===== Input / Output =====
export interface AdminLoginInput {
  accountUser_account: string
  accountUser_password: string
}

export interface AdminLoginOutput {
  token: string              // aggregated
  accountUser_id: string     // data-from: account_user-id
  accountUser_account: string // data-from: account_user-account
  accountUser_role: string   // data-from: account_user-role
}

export interface CheckSessionOutput {
  session_isLoggedIn: boolean // aggregated
}

// ===== Imports =====
import prisma from '@/tools/prisma'
import {
  tryGetAuthContext,
  withResult,
  hashPassword,
  signToken,
  UserRole
} from '@/backend/action_utils'

// ===== Actions =====

/**
 * التحقق من وجود جلسة مدير نشطة مسبقاً
 * يستخدم لمنع المستخدم من إعادة فتح صفحة الدخول إذا كان مسجلاً بالفعل
 */
export const checkAdminSession = withResult(async (): Promise<CheckSessionOutput> => {
  const context = tryGetAuthContext()
  
  if (context && context.role === UserRole.ADMIN) {
    return { session_isLoggedIn: true }
  }
  
  return { session_isLoggedIn: false }
})

/**
 * تسجيل دخول مدير النظام
 * يتحقق من صحة الحساب وكلمة المرور ويصدر رمز جلسة
 */
export const adminLogin = withResult(async (input: AdminLoginInput): Promise<AdminLoginOutput> => {
  const trimmedAccount = input.accountUser_account.trim()

  if (!trimmedAccount || !input.accountUser_password) {
    throw new Error('يرجى إدخال اسم الحساب وكلمة المرور')
  }

  // البحث عن المستخدم باستخدام الحساب (تطابق تام)
  const user = await prisma.account_user.findUnique({
    where: { 
      account: trimmedAccount 
    }
  })

  // رسالة خطأ عامة لعدم كشف تفاصيل حساسة (حساب غير موجود أو كلمة مرور خاطئة)
  const genericErrorMessage = 'بيانات الدخول غير صحيحة'

  if (!user) {
    throw new Error(genericErrorMessage)
  }

  // التحقق من صحة كلمة المرور باستخدام التشفير
  const hashedInputPassword = hashPassword(input.accountUser_password)
  
  if (user.password !== hashedInputPassword) {
    throw new Error(genericErrorMessage)
  }

  // التأكد من أن الدور الوظيفي هو ADMIN كما هو متطلب في القيود
  if (user.role !== UserRole.ADMIN) {
    throw new Error('عذراً، هذا الحساب لا يملك صلاحيات الإدارة')
  }

  // إصدار رمز الجلسة (JWT Token)
  const token = await signToken(user.id, user.role)

  return {
    token,
    accountUser_id: user.id,
    accountUser_account: user.account,
    accountUser_role: user.role
  }
})
