/**
 * Tipi di subscription per i moduli
 */
export enum SubscriptionType {
  None = 0,
  Monthly = 1,
  Annual = 2,
}

/**
 * Informazioni sulla subscription di un modulo
 */
export interface SubscriptionDto {
  id: number;
  moduleId: number;
  moduleCode?: string;
  moduleName?: string;
  isEnabled: boolean;
  subscriptionType: SubscriptionType;
  subscriptionTypeName: string;
  startDate?: string;
  endDate?: string;
  autoRenew: boolean;
  notes?: string;
  lastRenewalDate?: string;
  paidPrice?: number;
  isValid: boolean;
  daysRemaining?: number;
  isExpiringSoon: boolean;
}

/**
 * Rappresenta un modulo dell'applicazione
 */
export interface ModuleDto {
  id: number;
  code: string;
  name: string;
  description?: string;
  icon?: string;
  basePrice: number;
  monthlyPrice: number;
  monthlyMultiplier: number;
  sortOrder: number;
  isCore: boolean;
  dependencies: string[];
  routePath?: string;
  isAvailable: boolean;
  isEnabled: boolean;
  subscription?: SubscriptionDto;
}

/**
 * Stato di un modulo (risposta da /api/modules/{code}/enabled)
 */
export interface ModuleStatusDto {
  code: string;
  isEnabled: boolean;
  hasValidSubscription: boolean;
  isCore: boolean;
  daysRemaining?: number;
  isExpiringSoon: boolean;
}

/**
 * Request per attivare un modulo
 */
export interface EnableModuleRequest {
  subscriptionType?: SubscriptionType;
  startDate?: string;
  endDate?: string;
  autoRenew?: boolean;
  paidPrice?: number;
  notes?: string;
}

/**
 * Request per aggiornare una subscription
 */
export interface UpdateSubscriptionRequest {
  subscriptionType?: SubscriptionType;
  endDate?: string;
  autoRenew?: boolean;
  notes?: string;
}

/**
 * Request per rinnovare una subscription
 */
export interface RenewSubscriptionRequest {
  paidPrice?: number;
}

/**
 * Helper per ottenere il nome visualizzato del tipo subscription
 */
export function getSubscriptionTypeName(type: SubscriptionType): string {
  switch (type) {
    case SubscriptionType.None:
      return "Nessuno";
    case SubscriptionType.Monthly:
      return "Mensile";
    case SubscriptionType.Annual:
      return "Annuale";
    default:
      return "Sconosciuto";
  }
}

/**
 * Helper per formattare il prezzo
 */
export function formatPrice(price: number): string {
  return new Intl.NumberFormat("it-IT", {
    style: "currency",
    currency: "EUR",
  }).format(price);
}

/**
 * Helper per formattare la data
 */
export function formatDate(dateString?: string): string {
  if (!dateString) return "-";
  return new Date(dateString).toLocaleDateString("it-IT", {
    day: "2-digit",
    month: "2-digit",
    year: "numeric",
  });
}

/**
 * Helper per calcolare i giorni rimanenti
 */
export function getDaysRemainingText(days?: number): string {
  if (days === undefined || days === null) return "Nessuna scadenza";
  if (days === 0) return "Scaduto";
  if (days === 1) return "1 giorno";
  return `${days} giorni`;
}

/**
 * Helper per ottenere il colore dello stato subscription
 */
export function getSubscriptionStatusColor(
  subscription?: SubscriptionDto
): "success" | "warning" | "error" | "default" {
  if (!subscription || !subscription.isEnabled) return "default";
  if (!subscription.isValid) return "error";
  if (subscription.isExpiringSoon) return "warning";
  return "success";
}

/**
 * Helper per ottenere il testo dello stato subscription
 */
export function getSubscriptionStatusText(subscription?: SubscriptionDto): string {
  if (!subscription) return "Non attivo";
  if (!subscription.isEnabled) return "Disattivato";
  if (!subscription.isValid) return "Scaduto";
  if (subscription.isExpiringSoon) return "In scadenza";
  return "Attivo";
}

/**
 * Mappa delle icone MUI per i moduli
 */
export const moduleIcons: Record<string, string> = {
  warehouse: "Warehouse",
  purchases: "ShoppingCart",
  sales: "PointOfSale",
  production: "PrecisionManufacturing",
  quality: "VerifiedUser",
};
