class Team < ApplicationRecord include Brandable belongs_to :club has_many :user_teams, dependent: :destroy has_many :users, through: :user_teams has_many :matches, dependent: :destroy has_many :recordings, dependent: :destroy has_many :team_invitations, dependent: :destroy has_many :roster_members, class_name: "TeamRosterMember", dependent: :destroy has_one_attached :photo_file validates :name, presence: true validates :sport_key, presence: true validate :sport_key_known validate :photo_file_type, if: -> { photo_file.attached? } before_validation :normalize_sport_key def subscription club.subscription end def entitlements Teams::Entitlements.new(self) end # Canale YouTube OAuth è unico per tutta la società (Premium Full). def youtube_credential club&.youtube_credential end def owner club&.owner end def team_photo_url if photo_file.attached? Rails.application.routes.url_helpers.rails_blob_path(photo_file, only_path: true) end end def roster_by_category TeamRosterMember::DISPLAY_ORDER.index_with do |cat| roster_members.by_category(cat).to_a end end def sport_label Sports::Catalog.find_optional(sport_key)&.dig(:label) || sport_key.to_s.humanize end def effective_board_type Sports::Catalog.board_for(sport_key) end def sport sport_key end def sport=(value) self.sport_key = Sports::Catalog.normalize_key(value) end private def normalize_sport_key self.sport_key = Sports::Catalog.normalize_key(sport_key) if sport_key.present? end def sport_key_known return if sport_key.blank? return if Sports::Catalog.find_optional(sport_key) errors.add(:sport_key, "non valido") end def photo_file_type return if photo_file.content_type.in?(%w[image/png image/jpeg image/webp]) errors.add(:photo_file, "deve essere PNG, JPEG o WebP") end def branding_parent club end def default_primary_color club&.primary_color.presence || super end def default_secondary_color club&.secondary_color.presence || super end end