package com.saas.subscription.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

@Entity
@Table(name = "tenant_subscriptions")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TenantSubscription {

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

    @Column(nullable = false, unique = true)
    private String tenantId;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "plan_id", nullable = false)
    private SubscriptionPlan plan;

    @Column(name = "stripe_customer_id")
    private String stripeCustomerId;

    @Column(name = "stripe_subscription_id")
    private String stripeSubscriptionId;

    @Enumerated(EnumType.STRING)
    @Builder.Default
    @Column(nullable = false)
    private SubscriptionStatus status = SubscriptionStatus.ACTIVE;

    // --- 📅 Period ---

    @Builder.Default
    @Column(nullable = false)
    private LocalDateTime currentPeriodStart = LocalDateTime.now();

    @Builder.Default
    @Column(nullable = false)
    private LocalDateTime currentPeriodEnd = LocalDateTime.now().plusMonths(1); // Auto-renew date

    @Builder.Default
    @Column(nullable = false)
    private boolean autoRenew = true;

    @Builder.Default
    @Column(nullable = false)
    private boolean trialActive = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean canceledAtPeriodEnd = false;

    // --- 📈 Usage Tracking (Reset monthly) ---

    @Builder.Default
    @Column(nullable = false)
    private Integer usedMinutes = 0;

    @Builder.Default
    @Column(nullable = false)
    private Integer usedRecordingRetrievals = 0;

    // --- 💰 Overage Tracking ---

    @Builder.Default
    @Column(nullable = false)
    private Integer overageMinutes = 0; // Minutes consumed AFTER limit reached

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

    @UpdateTimestamp
    private LocalDateTime updatedAt;
}
