import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Request,
} from '@nestjs/common';
import type { Request as ExpressRequest } from 'express';
import { AgentSessionsService } from '../services/sessions.service';
import { resolveActor } from '../utils/auth-resolution.util';

@Controller('agent/sessions')
export class AgentSessionsController {
  constructor(private readonly sessionsService: AgentSessionsService) {}

  @Get()
  async listSessions(@Query() query: Record<string, string>, @Request() req: ExpressRequest) {
    const { orgId, userId } = resolveActor(req, query.organizationId);
    const items = await this.sessionsService.listSessions({
      organizationId: orgId,
      createdById: userId,
      limit: query.limit ? Number(query.limit) : undefined,
      projectId: query.projectId as string | 'null' | undefined,
    });
    return { items };
  }

  @Post()
  async createSession(
    @Body() body: { title?: string; projectId?: string; personaId?: string; organizationId?: string },
    @Request() req: ExpressRequest,
  ) {
    const { orgId, userId } = resolveActor(req, body.organizationId);
    return this.sessionsService.createSession({
      organizationId: orgId,
      createdById: userId,
      title: body.title,
      projectId: body.projectId,
      personaId: body.personaId,
    });
  }

  @Get(':id')
  async getSession(@Param('id') id: string, @Request() req: ExpressRequest) {
    const { orgId } = resolveActor(req);
    return this.sessionsService.getSession(id, orgId);
  }

  @Delete(':id')
  async deleteSession(@Param('id') id: string, @Request() req: ExpressRequest) {
    const { orgId } = resolveActor(req);
    return this.sessionsService.softDeleteSession(id, orgId);
  }

  @Patch(':id')
  async updateSession(
    @Param('id') id: string,
    @Body() body: { title?: string | null; personaId?: string | null; projectId?: string | null },
    @Request() req: ExpressRequest,
  ) {
    const { orgId } = resolveActor(req);
    return this.sessionsService.updateSession(id, orgId, body);
  }

  @Post(':id/rewind')
  async rewindSession(
    @Param('id') id: string,
    @Body() body: { afterSequence: number },
    @Request() req: ExpressRequest,
  ) {
    const { orgId } = resolveActor(req);
    return this.sessionsService.rewindAfter(id, orgId, body.afterSequence);
  }
}
