// =============================================================================
// TOM Generator Evidence Store
// Shared in-memory storage for evidence documents
// =============================================================================

import { EvidenceDocument, DocumentType } from './types'

interface StoredEvidence {
  tenantId: string
  documents: EvidenceDocument[]
}

class InMemoryEvidenceStore {
  private store: Map<string, StoredEvidence> = new Map()

  async getAll(tenantId: string): Promise<EvidenceDocument[]> {
    const stored = this.store.get(tenantId)
    return stored?.documents || []
  }

  async getById(tenantId: string, documentId: string): Promise<EvidenceDocument | null> {
    const stored = this.store.get(tenantId)
    return stored?.documents.find((d) => d.id === documentId) || null
  }

  async add(tenantId: string, document: EvidenceDocument): Promise<EvidenceDocument> {
    const stored = this.store.get(tenantId) || { tenantId, documents: [] }
    stored.documents.push(document)
    this.store.set(tenantId, stored)
    return document
  }

  async update(tenantId: string, documentId: string, updates: Partial<EvidenceDocument>): Promise<EvidenceDocument | null> {
    const stored = this.store.get(tenantId)
    if (!stored) return null

    const index = stored.documents.findIndex((d) => d.id === documentId)
    if (index === -1) return null

    stored.documents[index] = { ...stored.documents[index], ...updates }
    this.store.set(tenantId, stored)
    return stored.documents[index]
  }

  async delete(tenantId: string, documentId: string): Promise<boolean> {
    const stored = this.store.get(tenantId)
    if (!stored) return false

    const initialLength = stored.documents.length
    stored.documents = stored.documents.filter((d) => d.id !== documentId)
    this.store.set(tenantId, stored)
    return stored.documents.length < initialLength
  }

  async getByType(tenantId: string, type: DocumentType): Promise<EvidenceDocument[]> {
    const stored = this.store.get(tenantId)
    return stored?.documents.filter((d) => d.documentType === type) || []
  }

  async getByStatus(tenantId: string, status: string): Promise<EvidenceDocument[]> {
    const stored = this.store.get(tenantId)
    return stored?.documents.filter((d) => d.status === status) || []
  }
}

// Singleton instance for the application
export const evidenceStore = new InMemoryEvidenceStore()
