package com.saas.admin.entity;

import com.saas.shared.enums.Provider;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * Per-phone-number VoIP configuration for dynamic provider settings.
 * Each phone number can have its own AI provider, assistant ID, and settings.
 * Enables granular control: different configs for different phone lines.
 */
@Entity
@Table(name = "tenant_voip_configs", 
       indexes = {
           @Index(name = "idx_tenant_voip_tenant_id", columnList = "tenantId"),
           @Index(name = "idx_tenant_voip_provider", columnList = "provider"),
           @Index(name = "idx_tenant_voip_phone_number", columnList = "phoneNumberId", unique = true)
       })
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TenantVoipConfig {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * Phone number ID (FK to phone_numbers table)
     * Each phone number can have ONE VoIP configuration
     * Nullable to allow backward compatibility with existing tenant-level configs
     */
    @Column(nullable = true, name = "phone_number_id")
    private Long phoneNumberId;

    /**
     * Tenant ID (redundant with PhoneNumber.tenantId, but useful for queries)
     */
    @Column(nullable = false, length = 100)
    private String tenantId;

    /**
     * Provider (redundant with PhoneNumber.provider, but useful for filtering)
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false, length = 20)
    private Provider provider;

    /**
     * AI Assistant ID (e.g., Telnyx: assistant-xxx, ElevenLabs: agent_xxx)
     */
    @Column(length = 200)
    private String aiAssistantId;

    /**
     * AI Type: TELNYX_NATIVE_AI, WEBSOCKET_STREAM, OPENAI, ELEVENLABS
     */
    @Column(length = 50)
    private String aiType;

    /**
     * Messaging Profile ID for SMS (Telnyx)
     */
    @Column(length = 200)
    private String messagingProfileId;

    /**
     * WebSocket Stream URL for AI processing (when aiType=WEBSOCKET_STREAM)
     */
    @Column(length = 500)
    private String streamUrl;

    /**
     * Is this configuration active?
     */
    @Column(nullable = false)
    @Builder.Default
    private Boolean isActive = true;

    /**
     * Additional metadata (JSON) for future extensibility
     * Can store: webhook URLs, custom parameters, provider-specific settings
     */
    @Column(columnDefinition = "TEXT")
    private String metadata;

    @CreationTimestamp
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;

    @UpdateTimestamp
    @Column(nullable = false)
    private LocalDateTime updatedAt;
}
