import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
  UseGuards,
  Request,
} from '@nestjs/common';
import type { CreateTaskDto, UpdateTaskDto, ExecuteTaskDto } from './automation.service';
import { AutomationService } from './automation.service';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { AutomationTaskType, AutomationTaskStatus, AutomationExecutionStatus } from '@prisma/client';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';

@Controller('automation')
export class AutomationController {
  constructor(private readonly automationService: AutomationService) {}

  @Get('statistics')
  @RequirePermissions('system:read')
  getStatistics() {
    return this.automationService.getStatistics();
  }

  @Get('tasks')
  @RequirePermissions('system:read')
  findAll(
    @Query('type') type?: AutomationTaskType,
    @Query('status') status?: AutomationTaskStatus,
  ) {
    return this.automationService.findAll({ type, status });
  }

  @Get('tasks/:id')
  @RequirePermissions('system:read')
  findOne(@Param('id') id: string) {
    return this.automationService.findOne(id);
  }

  @Post('tasks')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  create(@Body() createTaskDto: CreateTaskDto, @Request() req: any) {
    return this.automationService.create(createTaskDto, req.user?.id);
  }

  @Patch('tasks/:id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  update(@Param('id') id: string, @Body() updateTaskDto: UpdateTaskDto) {
    return this.automationService.update(id, updateTaskDto);
  }

  @Delete('tasks/:id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  remove(@Param('id') id: string) {
    return this.automationService.remove(id);
  }

  @Post('tasks/:id/enable')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  enable(@Param('id') id: string) {
    return this.automationService.updateStatus(id, AutomationTaskStatus.ACTIVE);
  }

  @Post('tasks/:id/pause')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  pause(@Param('id') id: string) {
    return this.automationService.updateStatus(id, AutomationTaskStatus.PAUSED);
  }

  @Post('tasks/:id/disable')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  disable(@Param('id') id: string) {
    return this.automationService.updateStatus(id, AutomationTaskStatus.DISABLED);
  }

  @Post('tasks/:id/execute')
  @Auditable()
  @Sensitive()
  @RequirePermissions('system:update')
  execute(
    @Param('id') id: string,
    @Body() executeDto: ExecuteTaskDto,
    @Request() req: any,
  ) {
    return this.automationService.execute(id, {
      ...executeDto,
      triggeredBy: req.user?.id,
    });
  }

  @Get('tasks/:id/executions')
  @RequirePermissions('system:read')
  getExecutions(
    @Param('id') id: string,
    @Query('page') page?: string,
    @Query('pageSize') pageSize?: string,
    @Query('status') status?: AutomationExecutionStatus,
  ) {
    return this.automationService.getExecutions(id, {
      page: page ? parseInt(page) : undefined,
      pageSize: pageSize ? parseInt(pageSize) : undefined,
      status,
    });
  }

  @Get('executions/:id')
  @RequirePermissions('system:read')
  getExecutionDetail(@Param('id') id: string) {
    return this.automationService.getExecutionDetail(id);
  }
}

