import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  Query,
  UseGuards,
  UseInterceptors,
  UploadedFile,
  BadRequestException,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import type { CurrentUserPayload } from '@common/decorators/current-user.decorator';
import { ExcelService } from './services/excel.service';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';

@Controller('parts/excel')
export class ExcelController {
  constructor(private readonly excelService: ExcelService) {}

  /**
   * 导入 Excel 文件
   * 注意：需要前端使用 multipart/form-data 上传文件
   * 文件内容需要先解析为 JSON 格式再传给后端
   */
  @Post('import')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:write')
  async importExcel(
    @Body('rows') rows: any[],
    @Body('fileName') fileName: string,
    @Body('fileSize') fileSize: number,
    @Body('updateExisting') updateExisting: boolean = false,
    @Body('groupIds') groupIds: string[] = [],
    @CurrentUser() user: CurrentUserPayload,
  ) {
    if (!rows || !Array.isArray(rows) || rows.length === 0) {
      throw new BadRequestException('No data provided');
    }

    // 验证数据
    const validation = this.excelService.validateExcelData(rows);
    if (!validation.valid) {
      return {
        success: false,
        errors: validation.errors,
        message: 'Data validation failed',
      };
    }

    // 定义核心字段列名
    const coreFieldColumns = [
      'Part Number',
      'Part Name (EN)',
      'Part Name (CN)',
      'Unit',
      'Source',
      'Specifications',
      'Remark',
      'Station',
      'Warehouse Location',
      'Current Stock',
      'Min Stock',
      'Max Stock',
    ];

    // 转换为标准格式 - 匹配数据库schema
    const standardRows = rows.map((row) => {
      // 提取核心字段
      const coreData = {
        partNumber: row['Part Number'],
        partNameEn: row['Part Name (EN)'],  // 英文名称（必填）
        partNameCn: row['Part Name (CN)'],  // 中文名称（可选）
        unit: row['Unit'] || 'pcs',
        source: row['Source'],
        specifications: row['Specifications'],
        remark: row['Remark'],
        station: row['Station'],
        warehouseLocation: row['Warehouse Location'],
        currentStock: row['Current Stock'] ? parseInt(row['Current Stock']) : 0,
        minStock: row['Min Stock'] ? parseInt(row['Min Stock']) : 0,
        maxStock: row['Max Stock'] ? parseInt(row['Max Stock']) : undefined,
      };

      // 提取自定义字段（所有非核心字段的列）
      const customFields: Record<string, any> = {};
      Object.keys(row).forEach((key) => {
        // 跳过核心字段和空值
        if (!coreFieldColumns.includes(key) && row[key] !== '' && row[key] !== null && row[key] !== undefined) {
          // 移除字段名末尾的 "*" 标记（必填标记）
          const fieldKey = key.replace(/\*$/, '').trim();
          customFields[fieldKey] = row[key];
        }
      });

      return {
        ...coreData,
        customFields: Object.keys(customFields).length > 0 ? customFields : undefined,
        groupIds: groupIds.length > 0 ? groupIds : undefined,
      };
    });

    return this.excelService.importFromExcel(
      standardRows,
      user.userId,
      user.username,
      fileName,
      fileSize,
      updateExisting,
    );
  }

  /**
   * 导出零件数据到 Excel
   */
  @Get('export')
  @RequirePermissions('parts:export')
  async exportExcel(
    @Query('category') category?: string,
    @Query('station') station?: string,
    @Query('warehouseLocation') warehouseLocation?: string,
    @Query('status') status?: any,
  ) {
    return this.excelService.exportToExcel({
      category,
      station,
      warehouseLocation,
      status,
    });
  }

  /**
   * 下载 Excel 模板
   */
  @Get('template')
  @RequirePermissions('parts:read')
  async getTemplate() {
    return this.excelService.getExcelTemplate();
  }

  /**
   * 验证 Excel 数据
   */
  @Post('validate')
  @Auditable()
  @Sensitive()
  @RequirePermissions('parts:read')  // 暂时使用 parts:read 权限
  async validateExcel(@Body() body: any) {
    console.log('Validate request received:', {
      hasBody: !!body,
      hasRows: !!body?.rows,
      rowsType: Array.isArray(body?.rows) ? 'array' : typeof body?.rows,
      rowsCount: Array.isArray(body?.rows) ? body.rows.length : 0,
    });

    if (!body || !body.rows || !Array.isArray(body.rows)) {
      throw new BadRequestException('Invalid request: rows array is required');
    }
    
    try {
      const result = this.excelService.validateExcelData(body.rows);
      console.log('Validation result:', result);
      return result;
    } catch (error) {
      console.error('Validation error:', error);
      throw error;
    }
  }

  /**
   * 获取导入历史
   */
  @Get('import-history')
  @RequirePermissions('parts:read')
  async getImportHistory(
    @Query('page') page?: number,
    @Query('limit') limit?: number,
  ) {
    return this.excelService.getImportHistory(
      page ? parseInt(page.toString()) : 1,
      limit ? parseInt(limit.toString()) : 20,
    );
  }

  /**
   * 获取导入日志详情
   */
  @Get('import-log/:id')
  @RequirePermissions('parts:read')
  async getImportLog(@Param('id') id: string) {
    return this.excelService.getImportLog(id);
  }
}

