package com.saas.admin.repository;

import com.saas.admin.entity.VapiCall;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Repository for Vapi.ai calls
 * Supports multi-tenant isolation and analytics queries
 */
@Repository
public interface VapiCallRepository extends JpaRepository<VapiCall, Long> {
    
    Optional<VapiCall> findByVapiCallId(String vapiCallId);
    
    List<VapiCall> findByTenantId(String tenantId);
    
    List<VapiCall> findByTenantIdAndStatus(String tenantId, String status);
    
    List<VapiCall> findByAssistantId(String assistantId);
    
    List<VapiCall> findByTenantIdAndAssistantId(String tenantId, String assistantId);
    
    List<VapiCall> findByPhoneNumber(String phoneNumber);
    
    List<VapiCall> findByCustomerNumber(String customerNumber);
    
    List<VapiCall> findByStatus(String status);
    
    @Query("SELECT c FROM VapiCall c WHERE c.tenantId = :tenantId " +
           "AND c.createdAt BETWEEN :startDate AND :endDate " +
           "ORDER BY c.createdAt DESC")
    List<VapiCall> findByTenantIdAndDateRange(
        @Param("tenantId") String tenantId,
        @Param("startDate") LocalDateTime startDate,
        @Param("endDate") LocalDateTime endDate
    );
    
    @Query("SELECT c FROM VapiCall c WHERE c.createdAt BETWEEN :startDate AND :endDate " +
           "ORDER BY c.createdAt DESC")
    List<VapiCall> findByDateRange(
        @Param("startDate") LocalDateTime startDate,
        @Param("endDate") LocalDateTime endDate
    );
    
    @Query("SELECT COUNT(c) FROM VapiCall c WHERE c.tenantId = :tenantId")
    Long countByTenantId(@Param("tenantId") String tenantId);
    
    @Query("SELECT COUNT(c) FROM VapiCall c WHERE c.tenantId = :tenantId AND c.status = :status")
    Long countByTenantIdAndStatus(@Param("tenantId") String tenantId, @Param("status") String status);
    
    @Query("SELECT SUM(c.duration) FROM VapiCall c WHERE c.tenantId = :tenantId")
    Integer sumDurationByTenantId(@Param("tenantId") String tenantId);
}
