import { Alert } from '../models/Alert';
import mongoose from 'mongoose';

export interface CreateAlertParams {
  type: 'LowStock' | 'PMSchedule' | 'TicketSLA' | 'System';
  message: string;
  severity: 'Info' | 'Warning' | 'Critical';
  link?: string;
  userId?: mongoose.Types.ObjectId;
}

export const createAlert = async (params: CreateAlertParams): Promise<void> => {
  try {
    await Alert.create({
      type: params.type,
      message: params.message,
      severity: params.severity,
      link: params.link,
      userId: params.userId,
      isRead: false,
    });
  } catch (error) {
    console.error('Failed to create alert:', error);
    // Don't throw - alerts are non-critical
  }
};

export const createLowStockAlert = async (
  itemName: string,
  itemCode: string,
  currentStock: number,
  minStockLevel: number,
  itemId: string
): Promise<void> => {
  const severity = currentStock === 0 
    ? 'Critical' 
    : currentStock < minStockLevel * 0.5 
    ? 'Critical' 
    : 'Warning';

  const message = currentStock === 0
    ? `Hết hàng: ${itemName} (${itemCode})`
    : `Tồn kho thấp: ${itemName} (${itemCode}) - Còn lại: ${currentStock} ${minStockLevel > 0 ? `(Tối thiểu: ${minStockLevel})` : ''}`;

  await createAlert({
    type: 'LowStock',
    message,
    severity,
    link: `/inventory`,
  });
};

export const createPMScheduleAlert = async (
  scheduleTitle: string,
  nextDue: Date,
  scheduleId: string,
  projectId?: string
): Promise<void> => {
  const now = new Date();
  const daysUntilDue = Math.ceil((nextDue.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
  
  let severity: 'Info' | 'Warning' | 'Critical' = 'Info';
  let message = '';

  if (daysUntilDue < 0) {
    // Overdue
    severity = 'Critical';
    message = `Quá hạn bảo trì: ${scheduleTitle} (Quá hạn ${Math.abs(daysUntilDue)} ngày)`;
  } else if (daysUntilDue <= 3) {
    severity = 'Critical';
    message = `Bảo trì sắp đến hạn: ${scheduleTitle} (Còn ${daysUntilDue} ngày)`;
  } else if (daysUntilDue <= 7) {
    severity = 'Warning';
    message = `Bảo trì sắp đến hạn: ${scheduleTitle} (Còn ${daysUntilDue} ngày)`;
  } else {
    severity = 'Info';
    message = `Lịch bảo trì: ${scheduleTitle} (Còn ${daysUntilDue} ngày)`;
  }

  await createAlert({
    type: 'PMSchedule',
    message,
    severity,
    link: `/maintenance-schedule${projectId ? `?projectId=${projectId}` : ''}`,
  });
};

export const createTicketSLAAlert = async (
  ticketCode: string,
  ticketId: string,
  priority: string,
  slaDeadline?: Date,
  userId?: mongoose.Types.ObjectId
): Promise<void> => {
  let severity: 'Info' | 'Warning' | 'Critical' = 'Info';
  let message = '';

  if (priority === 'Critical') {
    severity = 'Critical';
    message = `Sự cố nghiêm trọng mới: ${ticketCode}`;
  } else if (slaDeadline) {
    const now = new Date();
    const hoursUntilDeadline = (slaDeadline.getTime() - now.getTime()) / (1000 * 60 * 60);
    
    if (hoursUntilDeadline < 0) {
      severity = 'Critical';
      message = `Ticket quá hạn SLA: ${ticketCode}`;
    } else if (hoursUntilDeadline <= 4) {
      severity = 'Critical';
      message = `Ticket sắp quá hạn SLA: ${ticketCode} (Còn ${Math.ceil(hoursUntilDeadline)} giờ)`;
    } else if (hoursUntilDeadline <= 8) {
      severity = 'Warning';
      message = `Ticket sắp quá hạn SLA: ${ticketCode} (Còn ${Math.ceil(hoursUntilDeadline)} giờ)`;
    }
  }

  if (message) {
    await createAlert({
      type: 'TicketSLA',
      message,
      severity,
      link: `/operations?ticketId=${ticketId}`,
      userId,
    });
  }
};

export const createTicketAssignmentAlert = async (
  ticketCode: string,
  ticketId: string,
  assignedToUserId: mongoose.Types.ObjectId | string,
  priority: string
): Promise<void> => {
  const severity = priority === 'Critical' ? 'Critical' : priority === 'High' ? 'Warning' : 'Info';
  const message = `Ticket ${ticketCode} đã được giao cho bạn`;

  await createAlert({
    type: 'TicketSLA',
    message,
    severity,
    link: `/operations?ticketId=${ticketId}`,
    userId: typeof assignedToUserId === 'string' 
      ? (mongoose.Types.ObjectId.isValid(assignedToUserId) ? new mongoose.Types.ObjectId(assignedToUserId) : undefined)
      : assignedToUserId,
  });
};

export const createContractExpiryAlert = async (
  contractNumber: string,
  contractId: string,
  daysUntilExpiry: number
): Promise<void> => {
  let severity: 'Info' | 'Warning' | 'Critical' = 'Info';
  let message = '';

  if (daysUntilExpiry < 0) {
    severity = 'Critical';
    message = `Hợp đồng đã hết hạn: ${contractNumber}`;
  } else if (daysUntilExpiry <= 7) {
    severity = 'Critical';
    message = `Hợp đồng sắp hết hạn: ${contractNumber} (Còn ${daysUntilExpiry} ngày)`;
  } else if (daysUntilExpiry <= 30) {
    severity = 'Warning';
    message = `Hợp đồng sắp hết hạn: ${contractNumber} (Còn ${daysUntilExpiry} ngày)`;
  }

  if (message) {
    await createAlert({
      type: 'System',
      message,
      severity,
      link: `/contracts?contractId=${contractId}`,
    });
  }
};

export const createComplianceExpiryAlert = async (
  docName: string,
  docId: string,
  daysUntilExpiry: number
): Promise<void> => {
  let severity: 'Info' | 'Warning' | 'Critical' = 'Info';
  let message = '';

  if (daysUntilExpiry < 0) {
    severity = 'Critical';
    message = `Văn bản tuân thủ đã hết hạn: ${docName}`;
  } else if (daysUntilExpiry <= 7) {
    severity = 'Critical';
    message = `Văn bản tuân thủ sắp hết hạn: ${docName} (Còn ${daysUntilExpiry} ngày)`;
  } else if (daysUntilExpiry <= 30) {
    severity = 'Warning';
    message = `Văn bản tuân thủ sắp hết hạn: ${docName} (Còn ${daysUntilExpiry} ngày)`;
  }

  if (message) {
    await createAlert({
      type: 'System',
      message,
      severity,
      link: `/compliance`,
    });
  }
};

export const createWorkOrderAlert = async (
  woCode: string,
  woId: string,
  message: string,
  severity: 'Info' | 'Warning' | 'Critical' = 'Warning'
): Promise<void> => {
  await createAlert({
    type: 'System',
    message: `Work Order ${woCode}: ${message}`,
    severity,
    link: `/work-orders?woId=${woId}`,
  });
};

export const createAssetAlert = async (
  assetName: string,
  assetCode: string,
  assetId: string,
  message: string,
  severity: 'Info' | 'Warning' | 'Critical' = 'Warning'
): Promise<void> => {
  await createAlert({
    type: 'System',
    message: `Tài sản ${assetName} (${assetCode}): ${message}`,
    severity,
    link: `/assets?assetId=${assetId}`,
  });
};
