import {
  Body,
  Controller,
  Get,
  Post,
  Query,
  Req,
  UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import {
  ApiBearerAuth,
  ApiOperation,
  ApiQuery,
  ApiTags,
} from '@nestjs/swagger';
import { SyncService } from './sync.service';

@ApiTags('Sync')
@Controller({ path: 'sync', version: '1' })
export class SyncController {
  constructor(private readonly syncService: SyncService) {}

  @Get('ping')
  @ApiOperation({
    summary: 'Health check para verificar conectividad real del POS',
  })
  ping() {
    return { ok: true, ts: Date.now() };
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('full')
  @ApiOperation({
    summary:
      'Sincronización completa — devuelve todos los catálogos para el POS',
  })
  async fullSync(@Req() req) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getFullSync(empresaId);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('delta')
  @ApiOperation({
    summary: 'Sincronización delta — solo cambios desde la última sync',
  })
  @ApiQuery({
    name: 'since',
    required: true,
    description: 'ISO timestamp de última sincronización',
  })
  async deltaSync(@Req() req, @Query('since') since: string) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getDeltaSync(empresaId, since);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('productos')
  @ApiOperation({ summary: 'Productos modificados desde una fecha' })
  @ApiQuery({ name: 'since', required: false })
  async syncProductos(@Req() req, @Query('since') since?: string) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getProductosDelta(empresaId, since);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('clientes')
  @ApiOperation({ summary: 'Clientes modificados desde una fecha' })
  @ApiQuery({ name: 'since', required: false })
  async syncClientes(@Req() req, @Query('since') since?: string) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getClientesDelta(empresaId, since);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('categorias')
  @ApiOperation({ summary: 'Categorías modificadas desde una fecha' })
  @ApiQuery({ name: 'since', required: false })
  async syncCategorias(@Req() req, @Query('since') since?: string) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getCategoriasDelta(empresaId, since);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('medios-pago')
  @ApiOperation({ summary: 'Medios de pago activos de la empresa' })
  async syncMediosPago(@Req() req) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getMediosPagoDelta(empresaId);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('referenciales')
  @ApiOperation({
    summary: 'Datos referenciales (afectación IVA, tipos, etc.)',
  })
  async syncReferenciales() {
    return this.syncService.getReferenciales();
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('numeraciones')
  @ApiOperation({ summary: 'Numeraciones activas de la empresa' })
  async syncNumeraciones(@Req() req) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getNumeraciones(empresaId);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Get('condiciones-pago')
  @ApiOperation({ summary: 'Condiciones de pago de la empresa' })
  async syncCondicionesPago(@Req() req) {
    const empresaId = req.user.empresa_id;
    return this.syncService.getCondicionesPago(empresaId);
  }

  @ApiBearerAuth()
  @UseGuards(AuthGuard('jwt'))
  @Post('push/ventas')
  @ApiOperation({ summary: 'Enviar ventas realizadas offline al servidor' })
  async pushVentas(@Req() req, @Body() body: { ventas: any[] }) {
    const empresaId = req.user.empresa_id;
    return this.syncService.pushVentasOffline(empresaId, body.ventas);
  }
}
