export const getEnumObject = (enumArray, key = 'value', value = 'label') =>
  enumArray.reduce((acc, option) => {
    acc[option[key]] = option[value]
    return acc
  }, {})

export const ROLES = Object.freeze([
  { value: 'admin', label: 'مدیر', changeable: false },
  { value: 'student', label: 'طلبه', changeable: true },
  { value: 'teacher', label: 'استاد', changeable: true },
  { value: 'counselor', label: 'مشاور', changeable: true },
  { value: 'missionary', label: 'مبلغ', changeable: true },
])

export const LOGIN_STEPS = Object.freeze({
  LOGIN: 1,
  LOGIN_WITH_VERIFY_CODE: 2,
  VERIFY_CODE: 3,
})

export const SIGNUP_STEPS = Object.freeze({
  SIGNUP: 1,
  VERIFY_CODE: 2,
})

export const STUDENT_REGISTRATION = Object.freeze({
  PERSONAL_INFORMATION: 1,
  EDUCATIONAL_INFORMATION: 2,
  PROFESSIONAL_INFORMATION: 3,
  SKILL_ASSESSMENT_PART_1: 4,
  SKILL_ASSESSMENT_PART_2: 5,
  SKILL_ASSESSMENT_PART_3: 6,
  SKILL_ASSESSMENT_PART_4: 7,
  SKILL_ASSESSMENT_PART_5: 8,
  SKILL_ASSESSMENT_PART_6: 9,
  SKILL_ASSESSMENT_PART_7: 10,
})

export const STUDENT_REGISTRATION_ORDER = Object.freeze(Object.values(STUDENT_REGISTRATION))

// User lifecycle states (Set User Status endpoint):
//   pending  – registered, phone not yet OTP-verified
//   verified – phone OTP-verified and registration steps completed (awaiting admin)
//   approved – approved by admin (full access)
//   blocked  – blocked by admin (no access; existing tokens revoked)
export const USER_STATUS = Object.freeze({
  pending: 'تأیید نشده',
  verified: 'در انتظار تأیید',
  approved: 'تأیید شده',
  blocked: 'مسدود',
})

export const MARITAL_STATUS = Object.freeze({
  single: 'مجرد',
  married: 'متاهل',
  divorced: 'مطلقه',
  widowed: 'بیوه',
})

export const GENDER = Object.freeze({
  male: 'اقا',
  female: 'خانم',
})

export const ROLE_LABELS = Object.freeze(Object.fromEntries(ROLES.map((r) => [r.value, r.label])))

export const CHANGEABLE_ROLES = Object.freeze(ROLES.filter((r) => r.changeable).map((r) => r.value))

export const EDUCATION_STATUS = Object.freeze({
  seminary_student: 'طلبه',
  graduate: 'فارغ التحصیلی',
})

export const SEMINARY_LEVEL = Object.freeze({
  level_2: 'سطح دو',
  level_3: 'سطح سه',
  level_4: 'سطح چهار',
})

export const UNIVERSITY_LEVEL = Object.freeze({
  bachelor: ' مقطع کارشناسی (لیسانس)',
  master: ' مقطع کارشناسی ارشد (فوق لیسانس)',
  phd: ' مقطع دکتری',
  not_applicable: 'طلبه نیستم',
})

export const PROPAGATION_PLATFORM = Object.freeze({
  home_gathering_occasional: 'روضه‌های خانگی مناسبتی',
  home_gathering_regular: 'جلسات خانگی ثابت',
  online: 'فضای مجازی',
  university: 'دانشگاه',
  school: 'مدرسه',
  other: 'سایر فضاهای تبلیغی',
  none: 'فعالیتی نداشته‌ام',
})

export const LOW_SATISFACTION_RESPONSE = Object.freeze({
  change_the_method: 'روش را عوض می‌کنید در حالی که ایمان به صحت آن دارید',
  insist_on_your_method:
    'اصرار بر روش و مسیر خود دارید و معتقد هستید مخاطب باید خود را به آن سطح برساند',
  other: 'کاری به غیر از گزینه‌های ذکر شده انجام می‌دهید',
})

export const SESSION_CANCELLATION_RESPONSE = Object.freeze({
  teach_how_to_reduce_costs: 'آموزش روش‌های کاهش هزینه به صاحب بیت',
  provide_solutions_to_cover_meeting_costs: 'ارائه راهکارهای تامین هزینه‌های جلسه',
  setup_or_find_an_alternative_meeting: 'راه‌اندازی یا پیدا کردن یک جلسه جایگزین با همان جمع',
  convince_the_homeowner_to_continue: 'توجیه و اقناع صاحب بیت برای ادامه دادن',
  other: 'کاری به غیر از گزینه‌های ذکر شده انجام می‌دهید',
})

export const AUDIENCE_CONFLICT_RESPONSE = Object.freeze({
  divide_the_crowd:
    'جمع را تفکیک می‌کنید و برای هر کدام متناسب با آن چیزی که می‌خواهند ارائه می‌دهید',
  convince_one_of_the_groups: 'سعی می‌کنید یکی از گروه‌ها را متقاعد کنید',
  considering_one_of_the_groups: 'بی‌توجه به یکی از گروه‌ها به ارائه خود می‌پردازید',
  other: 'کاری غیر از گزینه‌های ذکر شده را انجام می‌دهید',
})

export const COMPETING_PROPAGATOR_RESPONSE = Object.freeze({
  strengthen_yourself: 'خود را در زمینه ابزارها و روش‌ها تقویت می‌کنید تا جلسه شما پررونق شود',
  close_your_meeting_and_strengthen_the_preacher:
    'جلسه خود را تعطیل کرده و سعی در تقویت بنیه معرفتی مبلغه جلسه مذکور خواهید داشت',
  convince_the_other_preacher_to_strengthen_or_close:
    'سعی می‌کنید مبلغه دیگر را توجیه و اقناع کنید تا یا بنیه خود را تقویت کند یا جلسه را تعطیل کند',
  bring_a_skilled_person_with_me:
    'یک نفر دارای مهارت را به عنوان کمک و معین برای تقویت جلسه و روش و ابزارها، با خود همراه می‌کردم',
  other: 'کاری غیر از گزینه‌های ذکر شده انجام می‌دادم',
})

export const VERIFICATION_MEDIA_TYPE = Object.freeze({
  FAITH_PRODUCTION: 'faith_production',
  LEADER_MESSAGE: 'leader_message',
})

export const COURSE_CONTENT_TYPE = Object.freeze({
  video: 'ویدئو',
  voice: 'صوت',
  text: 'متن',
})

export const COURSE_CONTENT_TYPE_ACCEPT = Object.freeze({
  video: '.mp4,.webm,video/mp4,video/webm',
  voice: '.mp3,.wav,.m4a,.webm,audio/mpeg,audio/wav,audio/mp4,audio/webm',
  text: '.pdf,application/pdf',
})

export const COURSE_CONTENT_TYPE_MAX_SIZE = Object.freeze({
  video: 300 * 1024 * 1024,
  voice: 50 * 1024 * 1024,
  text: 50 * 1024 * 1024,
})

export const SESSION_TYPE = Object.freeze({
  in_person: 'حضوری',
  online: 'آنلاین',
  offline: 'آفلاین',
  video: 'ویدئو',
  audio: 'صوتی',
  text: 'متن',
  slide: 'اسلاید',
  pdf: 'PDF',
})

export const SESSION_PLATFORM = Object.freeze({
  zoom: 'Zoom',
  google_meet: 'Google Meet',
  teams: 'Microsoft Teams',
  custom: 'سایر',
})

export const ASSIGNMENT_PRIORITY = Object.freeze({
  mandatory: 'اجباری',
  optional: 'اختیاری',
})

// Single ticket-lifecycle vocabulary. Used by every ticket-like resource —
// admin /messages, admin /services, admin /consultations, counselor, student
// /my-tickets, /user/services, /user/consultants. Backend exposes exactly
// these three values across all of them.
export const TICKET_STATUS = Object.freeze({
  open: 'باز',
  answered: 'پاسخ داده شده',
  closed: 'بسته شده',
})

// Priority levels for student-created tickets. Sent to the backend on POST
// /student/tickets (currently carried via the `category` field).
export const TICKET_PRIORITY = Object.freeze({
  low: 'کم اهمیت',
  normal: 'عادی',
  high: 'مهم',
  urgent: 'فوری',
})

export const STUDENT_COURSE_STATUS = Object.freeze({
  active: 'در حال گذراندن',
  completed: 'تکمیل شده',
})

export const PRIORITY_STATUS = Object.freeze({
  high: 'بالا',
  medium: 'متوسط',
  low: 'پایین',
})

export const SERVICE_TYPE = Object.freeze({
  loan: 'وام',
  consultation: 'مشاوره',
  educational: 'آموزشی',
  other: 'سایر',
})

// Lifecycle of a dispatch request assigned to a missionary. `pending` is the
// initial backend state; the missionary may set seen, accepted, or rejected.
export const MISSIONARY_REQUEST_STATUS = Object.freeze({
  pending: 'در انتظار بررسی',
  seen: 'دیده شده',
  accepted: 'پذیرفته شده',
  rejected: 'رد شده',
})

// Landing route per role after login / when a logged-in user hits a guest
// page. Roles not listed here fall back to the student dashboard.
export const ROLE_HOME_ROUTES = Object.freeze({
  admin: 'admin-dashboard',
  counselor: 'counselor-dashboard',
  missionary: 'missionary-dashboard',
  student: 'student-dashboard',
})
