import {
  Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, UseGuards, ValidationPipe,
} 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 {
  CreateFechaEspecialDto, FechaComercialDto, UpdateFechaEspecialDto,
} from './dto/fecha-especial.dto';
import { FechasEspecialesService } from './fechas-especiales.service';

@ApiTags('CRM · Fechas especiales')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('CRM_FECHAS')
@Controller({ path: 'crm/fechas', version: '1' })
export class FechasEspecialesController {
  constructor(private readonly service: FechasEspecialesService) {}

  @Get('agenda')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_VER')
  @ApiQuery({ name: 'dias', required: false, description: 'Ventana en días. Por defecto 30.' })
  @ApiOperation({
    summary: 'Qué se festeja en los próximos días',
    description: 'Mezcla fechas de clientes y del calendario comercial, ordenadas por cercanía.',
  })
  agenda(@GetUser() user: LoginUserInfo, @Query('dias') dias?: string) {
    return this.service.agenda(user.empresa_id, dias ? Number(dias) : 30);
  }

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_VER')
  @ApiQuery({ name: 'cliente_id', required: false })
  @ApiQuery({ name: 'lead_id', required: false })
  @ApiOperation({ summary: 'Fechas de un cliente o lead' })
  findPorDueno(
    @GetUser() user: LoginUserInfo,
    @Query('cliente_id') cliente_id?: string,
    @Query('lead_id') lead_id?: string,
  ) {
    return this.service.findPorDueno(user.empresa_id, cliente_id, lead_id);
  }

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_CREAR')
  @ApiOperation({ summary: 'Agrega una fecha a un cliente o lead' })
  create(@Body(ValidationPipe) dto: CreateFechaEspecialDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Patch(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_EDITAR')
  update(@Param('id') id: string, @Body(ValidationPipe) dto: UpdateFechaEspecialDto, @GetUser() user: LoginUserInfo) {
    return this.service.update(id, dto, user.empresa_id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_ELIMINAR')
  remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.remove(id, user.empresa_id);
  }

  // ── Calendario comercial ────────────────────────────────────────────────────

  @Get('comerciales')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_VER')
  @ApiOperation({
    summary: 'Calendario comercial de la empresa',
    description: 'La primera vez siembra el calendario paraguayo (Día de la Madre 15/05, etc.).',
  })
  findComerciales(@GetUser() user: LoginUserInfo) {
    return this.service.findComerciales(user.empresa_id);
  }

  @Put('comerciales')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_EDITAR')
  @ApiOperation({
    summary: 'Crea o actualiza una fecha comercial',
    description: 'La clave es el nombre: mandar "Navidad" dos veces actualiza, no duplica.',
  })
  upsertComercial(@Body(ValidationPipe) dto: FechaComercialDto, @GetUser() user: LoginUserInfo) {
    return this.service.upsertComercial(dto, user.empresa_id, user.id);
  }

  @Delete('comerciales/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_FEC_FECHA_ELIMINAR')
  removeComercial(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.removeComercial(id, user.empresa_id);
  }
}
