import { Body, Controller, Get, Patch, Post, Delete, Param, Query, UseGuards } from '@nestjs/common';
import { WorkspacesService } from './workspaces.service';
import { JwtAuthGuard } from '../../common/guards/jwt.guard';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import { Workspace } from '../../common/decorators/workspace.decorator';
import { Roles } from '../../common/decorators/roles.decorator';
import { RolesGuard } from '../../common/guards/roles.guard';

@Controller('workspaces')
@UseGuards(JwtAuthGuard, RolesGuard)
export class WorkspacesController {
  constructor(private readonly workspacesService: WorkspacesService) {}

  @Post()
  async create(@CurrentUser('userId') userId: string, @Body() dto: any) {
    return this.workspacesService.create(userId, dto);
  }

  @Get(':id')
  async get(@Param('id') id: string) {
    return this.workspacesService.findById(id);
  }

  @Patch(':id')
  @Roles('owner', 'admin')
  async update(@Param('id') id: string, @Body() dto: any) {
    return this.workspacesService.update(id, dto);
  }

  @Get(':id/members')
  async listMembers(@Param('id') id: string, @Query() query: any) {
    return this.workspacesService.listMembers(id, query);
  }

  @Post(':id/invitations')
  @Roles('owner', 'admin')
  async invite(
    @Param('id') id: string,
    @CurrentUser('userId') userId: string,
    @Body() dto: { emails: string[]; role?: string },
  ) {
    return this.workspacesService.inviteMembers(id, userId, dto);
  }

  @Delete(':id/members/:userId')
  @Roles('owner', 'admin')
  async removeMember(
    @Param('id') id: string,
    @Param('userId') targetUserId: string,
    @CurrentUser('userId') currentUserId: string,
  ) {
    return this.workspacesService.removeMember(id, targetUserId, currentUserId);
  }

  @Patch(':id/members/:userId')
  @Roles('owner', 'admin')
  async updateMemberRole(
    @Param('id') id: string,
    @Param('userId') targetUserId: string,
    @Body() dto: { role: string },
  ) {
    return this.workspacesService.updateMemberRole(id, targetUserId, dto.role);
  }

  @Get(':id/analytics')
  async analytics(@Param('id') id: string) {
    return this.workspacesService.getAnalytics(id);
  }
}