package com.saas.admin.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * Vapi.ai Assistant Entity
 * 
 * Stores Vapi.ai voice assistant configurations
 * - Stored in admin database (saas_db) with tenantId for multi-tenant isolation
 * - Each assistant represents a configured Vapi.ai voice agent
 * - Linked to phone numbers via PhoneNumber.vapiAssistantId
 * 
 * Architecture:
 * - Multi-tenant: Each tenant manages their own assistants
 * - Provider integration: Creates/updates assistants via Vapi.ai REST API
 * - Call routing: Phone numbers are linked to specific assistants
 */
@Entity
@Table(name = "vapi_assistants", 
       indexes = {
           @Index(name = "idx_vapi_assistant_tenant", columnList = "tenant_id"),
           @Index(name = "idx_vapi_assistant_vapi_id", columnList = "vapi_assistant_id"),
           @Index(name = "idx_vapi_assistant_created_at", columnList = "created_at")
       })
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VapiAssistant {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /**
     * Tenant ID for multi-tenant isolation
     */
    @Column(name = "tenant_id", nullable = false, length = 100)
    private String tenantId;
    
    /**
     * Vapi.ai Assistant ID (returned by Vapi API after creation)
     */
    @Column(name = "vapi_assistant_id", unique = true, length = 200)
    private String vapiAssistantId;
    
    /**
     * Assistant name (user-defined)
     */
    @Column(name = "name", nullable = false, length = 200)
    private String name;
    
    /**
     * AI Model (e.g., gpt-4, gpt-3.5-turbo, claude-3-opus)
     */
    @Column(name = "model", nullable = false, length = 100)
    @Builder.Default
    private String model = "gpt-4";
    
    /**
     * Voice ID (Vapi.ai voice provider + voice ID)
     * Examples: "11labs-rachel", "playht-jennifer", "deepgram-aura"
     */
    @Column(name = "voice", nullable = false, length = 100)
    @Builder.Default
    private String voice = "11labs-rachel";
    
    /**
     * System prompt (instructions for the AI assistant)
     */
    @Column(name = "prompt", columnDefinition = "TEXT")
    private String prompt;
    
    /**
     * First message (greeting when call starts)
     */
    @Column(name = "first_message", columnDefinition = "TEXT")
    private String firstMessage;
    
    /**
     * Server URL for webhooks (optional)
     * Vapi sends events (function calls, end-of-call reports) here
     */
    @Column(name = "server_url", length = 500)
    private String serverUrl;
    
    /**
     * Server URL Secret (for webhook authentication)
     */
    @Column(name = "server_url_secret", length = 200)
    private String serverUrlSecret;
    
    /**
     * Additional configuration (JSON)
     * 
     * Examples:
     * - transcriber: {"provider": "deepgram", "model": "nova-2"}
     * - recordingEnabled: true
     * - endCallFunctionEnabled: true
     * - functions: [{"name": "bookAppointment", "parameters": {...}}]
     */
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "config", columnDefinition = "JSON")
    private Map<String, Object> config;
    
    /**
     * Assistant status
     */
    @Column(name = "status", length = 50)
    @Builder.Default
    private String status = "ACTIVE";  // ACTIVE, INACTIVE, DELETED
    
    /**
     * Timestamps
     */
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;
    
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
    
    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }
    
    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }
}
