import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Req,
  UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { UserRole } from '@prisma/client';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { RolesGuard } from '../../common/guards/roles.guard';
import { Roles } from '../../common/decorators/roles.decorator';
import { Permissions } from '../../common/decorators/permissions.decorator';
import { PermissionsGuard } from '../../common/guards/permissions.guard';
import { CreateLoyaltyProgramDto } from './dto/create-loyalty-program.dto';
import { UpdateLoyaltyProgramDto } from './dto/update-loyalty-program.dto';
import { SetLoyaltyProgramActiveDto } from './dto/set-loyalty-program-active.dto';
import { LoyaltyProgramsService } from './loyalty-programs.service';

type RequestWithUser = {
  user: {
    id: string;
    role: UserRole;
    shopId: string | null;
  };
};

@ApiTags('loyalty-programs')
@ApiBearerAuth()
@Controller('loyalty-programs')
@UseGuards(JwtAuthGuard, RolesGuard, PermissionsGuard)
@Roles(UserRole.SUPERADMIN, UserRole.ADMIN, UserRole.SUBADMIN)
@Permissions('loyalty')
export class LoyaltyProgramsController {
  constructor(private readonly loyalty: LoyaltyProgramsService) {}

  @Get()
  @ApiOkResponse({
    description:
      'List loyalty programs for current shop (or for shopId if SUPERADMIN)',
  })
  list(@Req() req: RequestWithUser, @Query('shopId') shopId?: string) {
    return this.loyalty.list(req.user, shopId);
  }

  @Post()
  @ApiOkResponse({ description: 'Create loyalty program for current shop' })
  create(@Req() req: RequestWithUser, @Body() dto: CreateLoyaltyProgramDto) {
    return this.loyalty.create(req.user, dto);
  }

  @Patch(':id')
  @ApiOkResponse({ description: 'Update loyalty program' })
  update(
    @Req() req: RequestWithUser,
    @Param('id') id: string,
    @Body() dto: UpdateLoyaltyProgramDto,
  ) {
    return this.loyalty.update(req.user, id, dto);
  }

  @Post(':id/active')
  @ApiOkResponse({ description: 'Activate / deactivate loyalty program' })
  setActive(
    @Req() req: RequestWithUser,
    @Param('id') id: string,
    @Body() dto: SetLoyaltyProgramActiveDto,
  ) {
    return this.loyalty.setActive(req.user, id, dto.isActive);
  }

  @Delete(':id')
  @ApiOkResponse({ description: 'Delete loyalty program' })
  remove(@Req() req: RequestWithUser, @Param('id') id: string) {
    return this.loyalty.remove(req.user, id);
  }
}
