class Match < ApplicationRecord
  belongs_to :team
  has_many :stream_sessions, dependent: :destroy

  ACTIVE_SESSION_STATUSES = %w[live connecting reconnecting paused].freeze

  validates :opponent_name, presence: true
  validates :sets_to_win, numericality: { greater_than: 0, less_than: 6 }

  # Partite ancora da giocare in diretta (orario nel futuro).
  scope :scheduled_for_live, -> {
    where.not(scheduled_at: nil).where("scheduled_at >= ?", Time.zone.now)
  }

  scope :scheduled_upcoming, -> { scheduled_for_live }

  def scheduled_upcoming?
    scheduled_at.present? && scheduled_at >= Time.zone.now
  end

  def scheduled_on_calendar?
    scheduled_at.present? && scheduled_at >= Time.zone.now.beginning_of_day
  end

  def active_stream_session
    stream_sessions.sort_by { |s| s.created_at }.reverse
      .find { |s| !%w[ended error].include?(s.status) }
  end

  def deletable?
    session = active_stream_session
    session.nil? || !session.resumable?
  end

  def public_status_label
    active = active_stream_session
    return "In corso / da riprendere" if active
    return "Programmata" if scheduled_upcoming?
    return "Pronta" if scheduled_at.present?

    "Senza orario"
  end

  scope :search_teams_or_opponents, lambda { |query|
    q = query.to_s.strip
    return all if q.blank?

    term = "%#{sanitize_sql_like(q)}%"
    joins(team: :club).where(
      "teams.name ILIKE :term OR matches.opponent_name ILIKE :term OR clubs.name ILIKE :term OR matches.location ILIKE :term",
      term: term
    )
  }

  def broadcast_active?
    stream_sessions.where(status: ACTIVE_SESSION_STATUSES).exists?
  end
end
