import { Request, Response } from 'express'
import { parse } from 'csv-parse/sync'
import { z } from 'zod'

const OrderRowSchema = z.object({
  order_id: z.string(),
  order_date: z.string(),
  customer_email: z.string().email(),
  customer_id: z.string().optional(),
  product_name: z.string(),
  product_category: z.string(),
  quantity: z.union([z.string(), z.number()]),
  line_total: z.union([z.string(), z.number()]),
  order_total: z.union([z.string(), z.number()]),
  order_status: z.enum(['completed', 'processing', 'pending', 'cancelled', 'refunded', 'on-hold']),
  payment_method: z.string().optional(),
  coupon_code: z.string().optional(),
  billing_city: z.string().optional(),
  billing_country: z.string().optional(),
})

export async function uploadCSV(req: Request, res: Response) {
  try {
    // This will be implemented with multer or similar
    res.json({ message: 'CSV upload endpoint - to be implemented' })
  } catch (error) {
    res.status(500).json({ error: 'Failed to upload CSV' })
  }
}

export async function processCSV(req: Request, res: Response) {
  try {
    const { csvData } = req.body
    
    if (!csvData) {
      return res.status(400).json({ error: 'CSV data is required' })
    }

    const records = parse(csvData, {
      columns: true,
      skip_empty_lines: true,
      trim: true,
    })

    // Validate and transform
    const validatedOrders = records.map((row: any) => {
      const validated = OrderRowSchema.parse(row)
      return {
        ...validated,
        quantity: typeof validated.quantity === 'string' 
          ? parseFloat(validated.quantity.replace(',', '.')) 
          : validated.quantity,
        lineTotal: typeof validated.line_total === 'string'
          ? parseFloat(validated.line_total.replace(',', '.'))
          : validated.line_total,
        orderTotal: typeof validated.order_total === 'string'
          ? parseFloat(validated.order_total.replace(',', '.'))
          : validated.order_total,
      }
    })

    res.json({ orders: validatedOrders, count: validatedOrders.length })
  } catch (error) {
    if (error instanceof z.ZodError) {
      return res.status(400).json({ error: 'Invalid CSV format', details: error.errors })
    }
    res.status(500).json({ error: 'Failed to process CSV' })
  }
}
