package com.social.media.infrastructure.persistence.socialaccount;

import jakarta.persistence.*;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * JPA Entity for Social Account
 * Maps to core_business.social_accounts table
 */
@Entity
@Table(name = "social_accounts", schema = "core_business")
public class SocialAccountJpaEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "account_code", unique = true, nullable = false, length = 20)
    private String accountCode;

    @Column(name = "company_id", nullable = false)
    private Long companyId;

    @Column(name = "social_network_id", nullable = false)
    private Long socialNetworkId;

    @Column(name = "responsible_user_id")
    private Long responsibleUserId;

    @Column(name = "username", nullable = false, length = 100)
    private String username;

    @Column(name = "display_name", length = 255)
    private String displayName;

    @Column(name = "bio", columnDefinition = "TEXT")
    private String bio;

    @Column(name = "profile_photo_url", length = 1000)
    private String profilePhotoUrl;

    @Column(name = "profile_url", length = 1000)
    private String profileUrl;

    @Column(name = "verified", nullable = false, columnDefinition = "BOOLEAN DEFAULT FALSE")
    private Boolean verified = false;

    @Column(name = "is_private", nullable = false, columnDefinition = "BOOLEAN DEFAULT FALSE")
    private Boolean isPrivate = false;

    @Column(name = "category", length = 100)
    private String category;

    @Column(name = "contact_phone", length = 20)
    private String contactPhone;

    @Column(name = "contact_email", length = 320)
    private String contactEmail;

    @Column(name = "location", length = 255)
    private String location;

    @Column(name = "website", length = 500)
    private String website;

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "metrics", columnDefinition = "jsonb")
    private Map<String, Object> metrics;

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "tokens", columnDefinition = "jsonb")
    private Map<String, Object> tokens;

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "automation_config", columnDefinition = "jsonb")
    private Map<String, Object> automationConfig;

    @Enumerated(EnumType.STRING)
    @Column(name = "connection_status", nullable = false)
    private ConnectionStatusEnum connectionStatus = ConnectionStatusEnum.INACTIVE;

    @Column(name = "last_sync_date")
    private LocalDateTime lastSyncDate;

    @Column(name = "next_sync_date")
    private LocalDateTime nextSyncDate;

    @Column(name = "last_sync_error", columnDefinition = "TEXT")
    private String lastSyncError;

    @Column(name = "active", nullable = false, columnDefinition = "BOOLEAN DEFAULT TRUE")
    private Boolean active = true;

    @Column(name = "registration_date", nullable = false)
    private LocalDateTime registrationDate = LocalDateTime.now();

    @Column(name = "last_update_date", nullable = false)
    private LocalDateTime lastUpdateDate = LocalDateTime.now();

    @Column(name = "deleted", nullable = false, columnDefinition = "BOOLEAN DEFAULT FALSE")
    private Boolean deleted = false;

    @Column(name = "created_at", nullable = false)
    private LocalDateTime createdAt = LocalDateTime.now();

    @Column(name = "updated_at", nullable = false)
    private LocalDateTime updatedAt = LocalDateTime.now();

    public enum ConnectionStatusEnum {
        ACTIVE, INACTIVE, SUSPENDED, BANNED, TOKEN_ERROR
    }

    // Constructors
    public SocialAccountJpaEntity() {}

    public SocialAccountJpaEntity(Long companyId, Long socialNetworkId, String username, 
                                 String displayName, Map<String, Object> tokens) {
        this.companyId = companyId;
        this.socialNetworkId = socialNetworkId;
        this.username = username;
        this.displayName = displayName;
        this.tokens = tokens;
        this.connectionStatus = ConnectionStatusEnum.ACTIVE;
        this.registrationDate = LocalDateTime.now();
        this.lastUpdateDate = LocalDateTime.now();
        this.createdAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }

    // Update timestamps on save
    @PrePersist
    protected void onCreate() {
        LocalDateTime now = LocalDateTime.now();
        if (createdAt == null) createdAt = now;
        if (updatedAt == null) updatedAt = now;
        if (registrationDate == null) registrationDate = now;
        if (lastUpdateDate == null) lastUpdateDate = now;
    }

    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
        lastUpdateDate = LocalDateTime.now();
    }

    // Getters and Setters
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getAccountCode() { return accountCode; }
    public void setAccountCode(String accountCode) { this.accountCode = accountCode; }

    public Long getCompanyId() { return companyId; }
    public void setCompanyId(Long companyId) { this.companyId = companyId; }

    public Long getSocialNetworkId() { return socialNetworkId; }
    public void setSocialNetworkId(Long socialNetworkId) { this.socialNetworkId = socialNetworkId; }

    public Long getResponsibleUserId() { return responsibleUserId; }
    public void setResponsibleUserId(Long responsibleUserId) { this.responsibleUserId = responsibleUserId; }

    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }

    public String getDisplayName() { return displayName; }
    public void setDisplayName(String displayName) { this.displayName = displayName; }

    public String getBio() { return bio; }
    public void setBio(String bio) { this.bio = bio; }

    public String getProfilePhotoUrl() { return profilePhotoUrl; }
    public void setProfilePhotoUrl(String profilePhotoUrl) { this.profilePhotoUrl = profilePhotoUrl; }

    public String getProfileUrl() { return profileUrl; }
    public void setProfileUrl(String profileUrl) { this.profileUrl = profileUrl; }

    public Boolean getVerified() { return verified; }
    public void setVerified(Boolean verified) { this.verified = verified; }

    public Boolean getIsPrivate() { return isPrivate; }
    public void setIsPrivate(Boolean isPrivate) { this.isPrivate = isPrivate; }

    public String getCategory() { return category; }
    public void setCategory(String category) { this.category = category; }

    public String getContactPhone() { return contactPhone; }
    public void setContactPhone(String contactPhone) { this.contactPhone = contactPhone; }

    public String getContactEmail() { return contactEmail; }
    public void setContactEmail(String contactEmail) { this.contactEmail = contactEmail; }

    public String getLocation() { return location; }
    public void setLocation(String location) { this.location = location; }

    public String getWebsite() { return website; }
    public void setWebsite(String website) { this.website = website; }

    public Map<String, Object> getMetrics() { return metrics; }
    public void setMetrics(Map<String, Object> metrics) { this.metrics = metrics; }

    public Map<String, Object> getTokens() { return tokens; }
    public void setTokens(Map<String, Object> tokens) { this.tokens = tokens; }

    public Map<String, Object> getAutomationConfig() { return automationConfig; }
    public void setAutomationConfig(Map<String, Object> automationConfig) { this.automationConfig = automationConfig; }

    public ConnectionStatusEnum getConnectionStatus() { return connectionStatus; }
    public void setConnectionStatus(ConnectionStatusEnum connectionStatus) { this.connectionStatus = connectionStatus; }

    public LocalDateTime getLastSyncDate() { return lastSyncDate; }
    public void setLastSyncDate(LocalDateTime lastSyncDate) { this.lastSyncDate = lastSyncDate; }

    public LocalDateTime getNextSyncDate() { return nextSyncDate; }
    public void setNextSyncDate(LocalDateTime nextSyncDate) { this.nextSyncDate = nextSyncDate; }

    public String getLastSyncError() { return lastSyncError; }
    public void setLastSyncError(String lastSyncError) { this.lastSyncError = lastSyncError; }

    public Boolean getActive() { return active; }
    public void setActive(Boolean active) { this.active = active; }

    public LocalDateTime getRegistrationDate() { return registrationDate; }
    public void setRegistrationDate(LocalDateTime registrationDate) { this.registrationDate = registrationDate; }

    public LocalDateTime getLastUpdateDate() { return lastUpdateDate; }
    public void setLastUpdateDate(LocalDateTime lastUpdateDate) { this.lastUpdateDate = lastUpdateDate; }

    public Boolean getDeleted() { return deleted; }
    public void setDeleted(Boolean deleted) { this.deleted = deleted; }

    public LocalDateTime getCreatedAt() { return createdAt; }
    public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }

    public LocalDateTime getUpdatedAt() { return updatedAt; }
    public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
}
