import { Controller, Get, Param, Query, UseGuards, ParseUUIDPipe } from '@nestjs/common';
import { AuditService } from './audit.service';
import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard';
import { paginatedResponse } from '../../common/responses/api-response';
import { PaginationDto } from '../../common/dto/pagination.dto';
import { AuditQueryDto } from './dto/audit-query.dto';
import { AuditLogEntity } from '../../entities/audit-log.entity';
import { AuditItemContext } from './repositories/audit.repository';

function shape(item: AuditLogEntity, context: Map<string, AuditItemContext>) {
  const ctx = context.get(item.entity_id);
  return {
    id: item.id,
    entity_type: item.entity_type,
    entity_id: item.entity_id,
    action: item.action,
    changes: item.changes,
    performed_by: item.performed_by,
    performer_name:
      (item as AuditLogEntity & { performer?: { name?: string } }).performer?.name || null,
    ip_address: item.ip_address,
    request_id: item.request_id,
    created_at: item.created_at,
    // Deep-link helpers — populated only for item entity types (transport
    // / activity / hotel / special). Lets the FE build a Movement Chart
    // URL on the right date with a scroll-to-op-id.
    booking_id: ctx?.booking_id ?? null,
    item_date: ctx?.item_date ?? null,
  };
}

@Controller('audit')
@UseGuards(JwtAuthGuard)
export class AuditController {
  constructor(private readonly service: AuditService) {}

  @Get()
  async list(@Query() query: AuditQueryDto) {
    const { items, meta, context } = await this.service.getFiltered({
      page: query.page,
      limit: query.limit,
      entity_type: query.entity_type,
      action: query.action,
      performed_by: query.performed_by,
      from: query.from,
      to: query.to,
    });
    return paginatedResponse(
      items.map((i) => shape(i, context)),
      meta,
      'Audit logs fetched successfully',
    );
  }

  @Get(':entityType/:entityId')
  async getByEntity(
    @Param('entityType') entityType: string,
    @Param('entityId', ParseUUIDPipe) entityId: string,
    @Query() query: PaginationDto,
  ) {
    const { items, meta, context } = await this.service.getByEntity(entityType, entityId, query);
    return paginatedResponse(
      items.map((i) => shape(i, context)),
      meta,
      'Audit logs fetched successfully',
    );
  }
}
