using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Domain.Entities.Donations.ValueObject;
using Domain.Entities.Members;

namespace Domain.Entities.Donations;

public class DonationMeta
{
    [ForeignKey(nameof(ChannelID))]
    public virtual Channel? Channel { get; private set; }

    [ForeignKey(nameof(MemberID))]
    public virtual Member? Member { get; private set; }

    [Key]
    public int ID { get; private set; }

    public int ChannelID { get; private set; }

    public int MemberID { get; private set; }

    public int MinAmount { get; private set; } = DonationConstants.MinAmount;

    public bool IsPaused { get; private set; }

    public bool IsAccepting { get; private set; } = true;

    public bool IsAudioOnly { get; private set; }

    public bool IsVideoOnly { get; private set; }

    public DateTime? UpdatedAt { get; private set; }

    public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;

    private DonationMeta() { }

    public static DonationMeta Create(int channelID, int memberID)
    {
        return new DonationMeta
        {
            ChannelID = channelID,
            MemberID = memberID
        };
    }

    public void UpdateSettings(int minAmount, bool isAccepting)
    {
        MinAmount = minAmount;
        IsAccepting = isAccepting;
        UpdatedAt = DateTime.UtcNow;
    }

    public void UpdateRemoteState(bool isPaused, bool isAudioOnly, bool isVideoOnly)
    {
        IsPaused = isPaused;
        IsAudioOnly = isAudioOnly;
        IsVideoOnly = isVideoOnly;
        UpdatedAt = DateTime.UtcNow;
    }

    public void Pause() { IsPaused = true; UpdatedAt = DateTime.UtcNow; }
    public void Resume() { IsPaused = false; UpdatedAt = DateTime.UtcNow; }
    public void StopAccepting() { IsAccepting = false; UpdatedAt = DateTime.UtcNow; }
    public void StartAccepting() { IsAccepting = true; UpdatedAt = DateTime.UtcNow; }
}