import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { RequireSubmodulo } from 'src/auth/decorators/require-submodulo.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { SubmoduloGuard } from 'src/auth/guards/submodulo.guard';
import { PrismaService } from 'src/prisma/prisma.service';
import { TimelineService, type TipoEventoTimeline } from './timeline.service';

@ApiTags('CRM · Ficha 360')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('CRM_CLIENTES_360')
@Controller({ path: 'crm/clientes', version: '1' })
export class TimelineController {
  constructor(
    private readonly service: TimelineService,
    private readonly prisma: PrismaService,
  ) {}

  /** El saldo tiene permiso propio: no todo el que ve la ficha puede ver la deuda. */
  private async puedeVerSaldo(user: LoginUserInfo) {
    const tiene = await this.prisma.perfiles_privilegios.findFirst({
      where: {
        privilegios: { codigo: 'CRM_CLI_SALDO_VER' },
        perfiles: { usuario_perfiles: { some: { user_id: user.id } } },
      },
      select: { id: true },
    });
    return !!tiene;
  }

  @Get(':id/resumen')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_CLI_TIMELINE_VER')
  @ApiOperation({
    summary: 'Cabecera de la ficha 360',
    description: 'El bloque `credito` llega en null si el usuario no tiene CRM_CLI_SALDO_VER.',
  })
  async resumen(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.resumen(id, user.empresa_id, await this.puedeVerSaldo(user));
  }

  @Get(':id/timeline')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_CLI_TIMELINE_VER')
  @ApiOperation({
    summary: 'Línea de tiempo unificada del cliente',
    description:
      'Agrega actividades, oportunidades, presupuestos, facturas, notas de crédito, cobros y ' +
      'leads. Paginación por cursor de fecha: la próxima página se pide con `siguiente_cursor`.',
  })
  @ApiQuery({ name: 'cursor', required: false, description: 'Fecha ISO: trae lo anterior a eso.' })
  @ApiQuery({ name: 'limite', required: false, description: '1 a 100, por defecto 30.' })
  @ApiQuery({ name: 'tipos', required: false, description: 'CSV para filtrar, ej. "factura,cobro".' })
  timeline(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Query('cursor') cursor?: string,
    @Query('limite') limite?: string,
    @Query('tipos') tipos?: string,
  ) {
    return this.service.timeline(id, user.empresa_id, {
      cursor,
      limite: limite ? Number(limite) : undefined,
      tipos: tipos ? (tipos.split(',').map((t) => t.trim()) as TipoEventoTimeline[]) : undefined,
    });
  }
}
