import { notification, message } from 'antd';
import type { ArgsProps as NotificationArgsProps } from 'antd/es/notification';

/**
 * Common backend error messages mapped to Danish user-friendly messages
 */
const ERROR_TRANSLATIONS: Record<string, string> = {
  // CVR validation
  'CVR is required for business customers': 'CVR er påkrævet for erhvervskunder',
  'CVR is required for VAT-registered companies': 'CVR er påkrævet for momsregistrerede virksomheder',
  'Invalid CVR format': 'Ugyldigt CVR-format (skal være 8 cifre)',

  // Customer errors
  'Customer not found': 'Kunde ikke fundet',
  'Customer is deactivated': 'Kunden er deaktiveret',
  'Customer already exists': 'Kunden findes allerede',

  // Invoice errors
  'Invoice not found': 'Faktura ikke fundet',
  'Invoice must have at least one line': 'Fakturaen skal have mindst én linje',
  'Invoice has already been sent': 'Fakturaen er allerede sendt',
  'Invoice has already been voided': 'Fakturaen er allerede annulleret',
  'Cannot void a paid invoice': 'Kan ikke annullere en betalt faktura',
  'Payment amount exceeds remaining balance': 'Betalingsbeløbet overstiger restbeløbet',

  // Credit note errors
  'Credit note not found': 'Kreditnota ikke fundet',
  'Credit note must have at least one line': 'Kreditnotaen skal have mindst én linje',
  'Credit note has already been issued': 'Kreditnotaen er allerede udstedt',
  'Credit note has already been voided': 'Kreditnotaen er allerede annulleret',
  'Cannot void an applied credit note': 'Kan ikke annullere en anvendt kreditnota',
  'Application amount exceeds remaining credit': 'Beløbet overstiger resterende kredit',

  // Company errors
  'Company not found': 'Virksomhed ikke fundet',
  'Company name is required': 'Virksomhedsnavn er påkrævet',
  'Bank account number is required when registration number is provided': 'Kontonummer er påkrævet når reg.nr er udfyldt',

  // Fiscal year errors
  'Fiscal year not found': 'Regnskabsår ikke fundet',
  'Fiscal year is closed': 'Regnskabsåret er lukket',
  'Fiscal year is locked': 'Regnskabsåret er låst',
  'Cannot post to a closed fiscal year': 'Kan ikke bogføre på et lukket regnskabsår',
  'Cannot post to a locked fiscal year': 'Kan ikke bogføre på et låst regnskabsår',
  'Fiscal year duration must be between 6 and 18 months': 'Regnskabsårets varighed skal være mellem 6 og 18 måneder',
  'Fiscal year must be exactly 12 months': 'Regnskabsåret skal være præcis 12 måneder',

  // Account errors
  'Account not found': 'Konto ikke fundet',
  'Account number already exists': 'Kontonummeret findes allerede',
  'Cannot modify system account': 'Kan ikke ændre systemkonto',
  'Cannot delete account with transactions': 'Kan ikke slette konto med posteringer',

  // Journal entry errors
  'Journal entry is not balanced': 'Bilag balancerer ikke (debet skal være lig kredit)',
  'Voucher number already exists': 'Bilagsnummeret findes allerede',
  'Invalid VAT code': 'Ugyldig momskode',

  // Bank connection errors
  'Bank connection not found': 'Bankforbindelse ikke fundet',
  'Bank connection is not active': 'Bankforbindelsen er ikke aktiv',
  'Bank authorization expired': 'Bankautorisation er udløbet',
  'Bank synchronization failed': 'Banksynkronisering fejlede',
  'Cannot re-initiate an active connection': 'Kan ikke genoptage en aktiv forbindelse',
  'No bank accounts found in the connection': 'Ingen bankkonti fundet i forbindelsen',
  'Bank connection must be initiated before establishing': 'Bankforbindelse skal påbegyndes først',
  'Cannot disconnect a connection that was never initiated': 'Kan ikke afbryde en forbindelse der aldrig blev påbegyndt',
  'Cannot archive an active connection': 'Kan ikke arkivere en aktiv forbindelse',
  'Session ID is required': 'Session ID er påkrævet',
  'Authorization ID is required': 'Autorisations ID er påkrævet',

  // General errors
  'Unauthorized': 'Du har ikke adgang til denne handling',
  'Forbidden': 'Adgang nægtet',
  'Not found': 'Ikke fundet',
  'Internal server error': 'Der opstod en serverfejl',
  'Network error': 'Netværksfejl - tjek din internetforbindelse',
  'Request timeout': 'Anmodningen tog for lang tid',
  'Validation failed': 'Validering fejlede',

  // Additional customer errors
  'Customer name is required': 'Kundenavn er påkrævet',
  'Email format is invalid': 'Ugyldig email-format',
  'Phone number is invalid': 'Ugyldigt telefonnummer',

  // Additional company errors
  'Company CVR already exists': 'CVR-nummeret er allerede registreret',
  'Invalid fiscal year start month': 'Ugyldig startmåned for regnskabsår',

  // Attachment errors
  'Attachment not found': 'Bilag ikke fundet',
  'Attachment size exceeds limit': 'Bilag overstiger maksimal filstørrelse',
  'Invalid file type': 'Ugyldig filtype',
  'Maximum attachments exceeded': 'Maksimalt antal bilag overskredet',

  // Draft errors
  'Draft not found': 'Kladde ikke fundet',
  'Draft has already been posted': 'Kladden er allerede bogført',
  'Draft has already been discarded': 'Kladden er allerede kasseret',
  'Cannot modify posted draft': 'Kan ikke ændre en bogført kladde',

  // User access errors
  'User not found': 'Bruger ikke fundet',
  'User already has access': 'Brugeren har allerede adgang',
  'Cannot remove own access': 'Kan ikke fjerne egen adgang',
  'Invalid role': 'Ugyldig rolle',
};

/**
 * Extract a clean error message from various error types
 */
function extractErrorMessage(error: unknown): string {
  if (typeof error === 'string') {
    return error;
  }

  if (error instanceof Error) {
    // Remove "GraphQL request failed: " prefix if present
    let message = error.message;
    if (message.startsWith('GraphQL request failed: ')) {
      message = message.replace('GraphQL request failed: ', '');
    }

    // Try to extract the actual error message from GraphQL response
    const graphqlMatch = message.match(/:\s*(.+?)(?:\n|$)/);
    if (graphqlMatch) {
      return graphqlMatch[1].trim();
    }

    return message;
  }

  return 'Der opstod en uventet fejl';
}

/**
 * Translate backend error message to Danish
 */
function translateError(message: string): string {
  // Check for exact match first
  if (ERROR_TRANSLATIONS[message]) {
    return ERROR_TRANSLATIONS[message];
  }

  // Check for partial matches (case-insensitive)
  const lowerMessage = message.toLowerCase();
  for (const [key, translation] of Object.entries(ERROR_TRANSLATIONS)) {
    if (lowerMessage.includes(key.toLowerCase())) {
      return translation;
    }
  }

  // Return original if no translation found
  return message;
}

/**
 * Show an error notification (persistent, for API errors)
 * Uses notification.error for better visibility and user experience
 */
export function showError(
  error: unknown,
  title?: string,
  options?: Partial<NotificationArgsProps>
): void {
  const rawMessage = extractErrorMessage(error);
  const translatedMessage = translateError(rawMessage);

  notification.error({
    message: title || 'Fejl',
    description: translatedMessage,
    duration: 6, // 6 seconds - longer for errors so users can read
    placement: 'topRight',
    ...options,
  });
}

/**
 * Show a success message (brief toast)
 */
export function showSuccess(content: string, duration: number = 3): void {
  message.success(content, duration);
}

/**
 * Show a warning message
 */
export function showWarning(content: string, duration: number = 4): void {
  message.warning(content, duration);
}

/**
 * Show an info message
 */
export function showInfo(content: string, duration: number = 3): void {
  message.info(content, duration);
}

/**
 * Show an error notification with a specific title for form validation failures
 */
export function showValidationError(fieldErrors?: string[]): void {
  const description = fieldErrors?.length
    ? fieldErrors.join('\n')
    : 'Udfyld venligst alle påkrævede felter korrekt';

  notification.error({
    message: 'Validering fejlede',
    description,
    duration: 5,
    placement: 'topRight',
  });
}

/**
 * Show a network error notification
 */
export function showNetworkError(): void {
  notification.error({
    message: 'Netværksfejl',
    description: 'Kunne ikke forbinde til serveren. Tjek din internetforbindelse og prøv igen.',
    duration: 8,
    placement: 'topRight',
  });
}
