import { apiRequest, setTokens, clearTokens } from '../lib/api'
import { clearActiveBusiness } from '../lib/businessContext'
import type {
  AuthUser,
  LoginResponse,
  MeResponse,
  OtpSendResponse,
  OtpVerifyResponse,
  RegisterResponse,
  UserProfile,
} from '../types/auth'

export async function login(cellNumber: string, password: string) {
  const data = await apiRequest<LoginResponse>('/auth/login', {
    method: 'POST',
    body: { cellNumber, password },
  })

  setTokens(data.accessToken, data.refreshToken)
  return data
}

export async function register(input: {
  cellNumber: string
  password: string
  firstName: string
  lastName: string
  email?: string
  domain: string
}) {
  const data = await apiRequest<RegisterResponse>('/auth/register', {
    method: 'POST',
    body: input,
  })

  setTokens(data.accessToken, data.refreshToken)
  return data
}

export async function fetchCurrentUser(signal?: AbortSignal) {
  return apiRequest<MeResponse>('/auth/me', { auth: true, signal })
}

export async function updateProfile(
  payload: Partial<UserProfile> & {
    firstName?: string
    lastName?: string
    firstNameEn?: string
    lastNameEn?: string
    email?: string
  },
) {
  return apiRequest<{ message: string; user: AuthUser }>('/auth/profile', {
    method: 'PATCH',
    auth: true,
    body: payload,
  })
}

export async function changePassword(currentPassword: string, newPassword: string) {
  return apiRequest<{ message: string }>('/auth/change-password', {
    method: 'POST',
    auth: true,
    body: { currentPassword, newPassword },
  })
}

export async function sendOtp(cellNumber: string) {
  return apiRequest<OtpSendResponse>('/auth/send-otp', {
    method: 'POST',
    body: { cellNumber },
  })
}

export async function verifyOtp(cellNumber: string, code: string) {
  return apiRequest<OtpVerifyResponse>('/auth/verify-otp', {
    method: 'POST',
    body: { cellNumber, code },
  })
}

export async function loginWithOtp(cellNumber: string, code: string) {
  const data = await apiRequest<LoginResponse>('/auth/login-otp', {
    method: 'POST',
    body: { cellNumber, code },
  })

  setTokens(data.accessToken, data.refreshToken)
  return data
}

export async function resetPassword(cellNumber: string, code: string, newPassword: string) {
  return apiRequest<{ message: string }>('/auth/reset-password', {
    method: 'POST',
    body: { cellNumber, code, newPassword },
  })
}

export function logout() {
  clearTokens()
  clearActiveBusiness()
}
