import { Injectable, NotFoundException, ForbiddenException } from '@nestjs/common';
import { PrismaService } from '@core/database/prisma/prisma.service';
import type { AgentTaskTracker, AgentTaskStatus } from '@prisma/client';

@Injectable()
export class TaskTrackerService {
  constructor(private readonly prisma: PrismaService) {}

  async create(args: {
    organizationId: string;
    sessionId: string;
    parentTaskId?: string;
    title: string;
    description?: string;
    createdById: string;
    metadata?: unknown;
  }): Promise<AgentTaskTracker> {
    return this.prisma.agentTaskTracker.create({
      data: {
        organizationId: args.organizationId,
        sessionId: args.sessionId,
        parentTaskId: args.parentTaskId ?? null,
        title: args.title,
        description: args.description ?? null,
        createdById: args.createdById,
        metadata: (args.metadata as never) ?? undefined,
      },
    });
  }

  async listForSession(sessionId: string, organizationId: string): Promise<AgentTaskTracker[]> {
    return this.prisma.agentTaskTracker.findMany({
      where: { sessionId, organizationId },
      orderBy: { createdAt: 'desc' },
    });
  }

  async updateStatus(
    id: string,
    organizationId: string,
    patch: { status?: AgentTaskStatus; progress?: number; metadata?: unknown },
  ): Promise<AgentTaskTracker> {
    const existing = await this.prisma.agentTaskTracker.findUnique({ where: { id } });
    if (!existing) throw new NotFoundException();
    if (existing.organizationId !== organizationId) throw new ForbiddenException();
    return this.prisma.agentTaskTracker.update({
      where: { id },
      data: {
        status: patch.status,
        progress: patch.progress,
        metadata: patch.metadata as never,
      },
    });
  }
}
