/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.any23.vocab;

import org.eclipse.rdf4j.model.IRI;

/**
 * <p>The <a href="http://purl.org/ontology/po/">Programmes Ontology</a> is aimed
 * at providing a simple vocabulary for describing programmes.</p> 
 * <p>It covers brands, series (seasons), episodes, broadcast events, broadcast 
 * services, etc. Its development was funded by the BBC, and is heavily grounded 
 * on previous programmes data modeling work done there.</p>
 * 
 * @author lewismc
 */
public class Programme extends Vocabulary {

  public static final String NS = "http://purl.org/ontology/po/";

  private static Programme instance;

  public static Programme getInstance() {
    if(instance == null) {
      instance = new Programme();
    }
    return instance;
  }

  //Resources
  /** A version holding an audio description. */
  public final IRI AudioDescribedVersion  = createClass(NS, "AudioDescribedVersion");

  /** A brand, e.g. `Top Gea`r*/
  public final IRI Brand                = createClass(NS, "Brand");

  /** 
   * A broadcast event. Subsumes the event concept defined in the Event ontology.
   * A broadcast is associated with a service, and with a particular version of an episode.
   */
  public final IRI Broadcast          = createClass(NS, "Broadcast");

  /**   An organization responsible of some broadcasting services.
   * It can hold a set of services and outlets.
   */
  public final IRI Broadcaster             = createClass(NS, "Broadcaster");

  /** A category provides a way of classifying a set of programmes. 
   * Such classifications can be performed according to multiple 
   * dimensions and taxonomies, e.g. genre, format, places, people, subjects...
   */
  public final IRI Category          = createClass(NS, "Category");

  /** A physical channel on which a broadcast occurs.
   * A single outlet or service can be associated with multiple channels.
   * For example, Radio 4 LW broadcasts on Analogue Long Wave and on Digital
   * Satellite.
   */
  public final IRI Channel           = createClass(NS, "Channel");

  /** A particular clip, e.g. `Clip of Top Gear, first series' */
  public final IRI Clip          = createClass(NS, "Clip");

  /** 
   * Digital Audio Broadcasting */
  public final IRI DAB         = createClass(NS, "DAB");

  /** Digital Video Broadcasting*/
  public final IRI DVB           = createClass(NS, "DVB");

  /** 
   * A particular episode, e.g. `Top Gear, first episode of the first series' 
   * or the film 'A Walk in the Sun' (http://www.bbc.co.uk/programmes/b00gfzdt)
   */
  public final IRI Episode          = createClass(NS, "Episode");

  /** The FM broadcast band */
  public final IRI FM           = createClass(NS, "FM");

  /** Specifies a broadcast as being the first one of a particular version.*/
  public final IRI FirstBroadcast        = createClass(NS, "FirstBroadcast");
  
  /**  
   * Anchor point for format taxonomies, similar to po:Genre for genre taxonomies.
   * Instances of this concept include documentaries, talk shows, animation, etc.
   */
  public final IRI Format        = createClass(NS, "Format");
  
  /**  
   * An anchor point for a programmes' genre taxonomy, #
   * e.g. 'Drama'/'Biographical'.*/
  public final IRI Genre        = createClass(NS, "Genre");
  
  /** IP Stream*/
  public final IRI IPStream        = createClass(NS, "IPStream");
  
  /** The AM broadcast band.*/
  public final IRI LW        = createClass(NS, "LW");
  
  /** Radio services aiming at a local coverage.*/
  public final IRI LocalRadio        = createClass(NS, "LocalRadio");
  
  /** Classification of an episode version's region corresponding to a 
   * musical track being played..*/
  public final IRI MusicSegment        = createClass(NS, "MusicSegment");
  
  /** Radio services aiming at a national coverage.*/
  public final IRI NationalRadio        = createClass(NS, "NationalRadio");
  
  /** An `original' version, the legacy version of a particular episode.*/
  public final IRI OriginalVersion        = createClass(NS, "OriginalVersion");
  
  /** Outlet of a particular service, e.g. Radio 4 LW and FM for Radio 4.
   * Outlets are services which do not have variations. The identity criteria 
   * for an outlet is its timeline. For example, Radio 4 LW broadcasts on 
   * Analogue Long Wave, but also on Digital Satellite. It corresponds to just 
   * one outlet, as they are simulcasts. The two physical channels for 
   * broadcasts correspond to po:Channel.*/
  public final IRI Outlet        = createClass(NS, "Outlet");
  
  /** A Person.*/
  public final IRI Person        = createClass(NS, "Person");
  
  /** A physical place.*/
  public final IRI Place        = createClass(NS, "Place");
  
  /** A programme, can either be a brand, a series or an episode.*/
  public final IRI Programme        = createClass(NS, "Programme");
  
  /** A programme that can have versions, and as such can be broadcast or 
   * made available on-demand, e.g. a clip or an episode.*/
  public final IRI ProgrammeItem        = createClass(NS, "ProgrammeItem");
  
  /** Services that use a radio medium.*/
  public final IRI Radio        = createClass(NS, "Radio");
  
  /** Radio services aiming at a regional coverage.*/
  public final IRI RegionalRadio        = createClass(NS, "RegionalRadio");
  
  /** Specifies a broadcast as being a repeat.*/
  public final IRI RepeatBroadcast        = createClass(NS, "RepeatBroadcast");
  
  /** A season is a group of broadcasts.*/
  public final IRI Season        = createClass(NS, "Season");
  
  /** Classification of an episode version's region, e.g. 
   * 'this track was played at that time'.*/
  public final IRI Segment        = createClass(NS, "Segment");
  
  /** A series, e.g. `Top Gear, first season'*/
  public final IRI Series        = createClass(NS, "Series");
  
  /** A broadcasting service. Instances of this concept include BBC Radio Wales, 
   * BBC Radio 4, BBC News, etc. A service is a collection of outlets which 
   * contain common material, but with some variations, e.g. by region.
   * Hence, a service may have multiple outlets (po:Outlet), e.g. BBC Radio 4 
   * has BBC Radio 4 LW and BBC Radio 4 FM. A hierarchy of services types is 
   * defined within this ontology, e.g. radio and TV. A service that is a master 
   * brand only (a service that only commissions programmes, e.g. BBC Switch) should
   * be an instance of the top-level po:Service.*/
  public final IRI Service        = createClass(NS, "Service");
  
  /** A shortened version.*/
  public final IRI ShortenedVersion        = createClass(NS, "ShortenedVersion");
  
  /** Classification of an episode version's region holding speech content.*/
  public final IRI SpeechSegment        = createClass(NS, "SpeechSegment");
  
  /** Anchor point for subject taxonomies.*/
  public final IRI SignedVersion        = createClass(NS, "SignedVersion");
  
  /** A version holding sign language.*/
  public final IRI Subject        = createClass(NS, "Subject");
  
  /** Classification of an episode version's region corresponding to a subtitle being shown. */
  public final IRI Subtitle        = createClass(NS, "Subtitle");
  
  /** Services that use a television medium.*/
  public final IRI TV        = createClass(NS, "TV");
  
  /** A particular version of an episode.
   * Such versions include shortened ones, audio described ones
   * or ones that holds sign language.
   * The version is associated to a timeline.*/
  public final IRI Version        = createClass(NS, "Version");
  
  /** Services that use a Web medium.*/
  public final IRI Web        = createClass(NS, "Web");

  //Properties
  /** Relates a programmes to one of its actors - a person who plays the 
   * role of a character. */
  public final IRI actor                   = createProperty(NS, "actor");

  /** A television reporter who coordinates a programme. */
  public final IRI anchor               = createProperty(NS, "anchor");

  /** The aspect ration of a particular version.*/
  public final IRI aspect_ratio           = createProperty(NS, "aspect_ratio"); 

  /** Relates a programme to its author - the person who created the content */
  public final IRI author                = createProperty(NS, "author");

  /** Relates a particular broadcast to the version being broadcasted.
   * Sub-property of the event:factor one.*/
  public final IRI broadcast_of              = createProperty(NS, "broadcast_of");

  /** Relates a particular broadcast to the service or outlet on which it was on.
   * Sub-property of the event:factor one. */
  public final IRI broadcast_on            = createProperty(NS, "broadcast_on");

  /** Associates a service to a broadcaster. */
  public final IRI broadcaster                = createProperty(NS, "broadcaster");

  /** Relates a programme to a particular category, e.g. genre, format, place...*/
  public final IRI category           = createProperty(NS, "category"); 

  /**  Associates a service to a channel, e.g. Radio 4 LW to Radio 4 LW on
   *  Analogue Long Wave.*/
  public final IRI channel               = createProperty(NS, "channel");

  /** Associates a brand, a series or an episode to a clip.*/
  public final IRI clip                = createProperty(NS, "clip");

  /** Relates a programme to one of its commentators */
  public final IRI commentator             = createProperty(NS, "commentator");

  /** Relates a programmes to a person who is credited in it */
  public final IRI credit              = createProperty(NS, "credit");

  /** Relates a programme to its supervisor. Generally refers to the person 
   * responsible for all audience-visible components of a program, film, or show, 
   * whereas the producer is responsible for the financial and other 
   * behind-the-scenes aspects. A director's duties might also include casting, 
   * script editing, shot selection, shot composition, and editing */
  public final IRI director                 = createProperty(NS, "director");

  /** The duration of a version, in seconds. */
  public final IRI duration                 = createProperty(NS, "duration");

  /** Associates a brand or a series to an episode constituting it.*/
  public final IRI episode               = createProperty(NS, "episode");

  /** Relates a programme to its executive producer - a producer who is not involved 
   * in any technical aspects of the making process, but who is still responsible 
   * for the overall production. Typically an executive producer handles business and 
   * legal issues */
  public final IRI executive_producer          = createProperty(NS, "executive_producer");

  /** Relates a programme to a particular format (eg. `Animation', `Documentary', etc.).*/
  public final IRI format        = createProperty(NS, "format"); 

  /** Associates a channel to its frequency */
  public final IRI frequency               = createProperty(NS, "frequency");

  /** Relates a programme to a particular genre.*/
  public final IRI genre           = createProperty(NS, "genre"); 

  /** Associates a service to a geographic location, aiming at capturing what 
   * this service aims at covering.*/
  public final IRI location                   = createProperty(NS, "location");

  /** A long synopsis of a serie, brand or episode. Sub-property of po:synopsis.*/
  public final IRI long_synopsis           = createProperty(NS, "long_synopsis"); 

  /** Associates a programme with its masterbrand (its commissionner) */
  public final IRI masterbrand            = createProperty(NS, "masterbrand");

  /** A medium synopsis of a serie, brand or episode. Sub-property of po:synopsis.*/
  public final IRI medium_synopsis             = createProperty(NS, "medium_synopsis");

  /** Associates a programme to its microsite. For example 
   * http://www.bbc.co.uk/programmes/b00fm04s and http://www.bbc.co.uk/eastenders/ */
  public final IRI microsite              = createProperty(NS, "microsite");

  /** Relates a programme to its news reader */
  public final IRI news_reader             = createProperty(NS, "news_reader");

  /** Associates a service to an outlet, e.g. Radio 4 to Radio 4 LW.*/
  public final IRI outlet             = createProperty(NS, "outlet");

  /** Relates a series to a series constituting it (eg. `Waking the dead').*/
  public final IRI parent_series                 = createProperty(NS, "parent_series");

  /** Relates a service to another service encapsulating it (eg. `BBC One' and `BBC One South')*/
  public final IRI parent_service                 = createProperty(NS, "parent_service");

  /** Relates a programme to one of its participants */
  public final IRI participant   = createProperty(NS, "participant"); 

  /** Relates a programme to an entertainer who performs a dramatic or musical work for audience */
  public final IRI performer                     = createProperty(NS, "performer");

  /** Relates a programme to a person*/
  public final IRI person              = createProperty(NS, "person");

  /** Relates a programme to a place (e.g. `London')*/
  public final IRI place       = createProperty(NS, "place"); 

  /** The position of a particular series or episode within its containing programme. 
   * This property can also be used to give the position of an interval 
   * within the containing timeline. */
  public final IRI position               = createProperty(NS, "position");

  /** Relates a programme to its producer - the manager of an event, show, 
   * or other work, usually the individual in charge of finance, personnel, 
   * and other non-artistic aspects in the development of commercials, 
   * plays, movies, and other works */
  public final IRI producer                 = createProperty(NS, "producer");

  /** The schedule date of a broadcast event.*/
  public final IRI schedule_date               = createProperty(NS, "schedule_date");

  /** Associates a season to its constituent broadcasts */
  public final IRI season_broadcast               = createProperty(NS, "season_broadcast");

  /** Associates a brand or a series to a series constituting it.*/
  public final IRI series                   = createProperty(NS, "series");
  
  /** Associate a brand, series or episode to the master brand service.*/
  public final IRI service                   = createProperty(NS, "service");
  
  /**   A short synopsis of a serie, brand or episode. Sub-property of po:synopsis.*/
  public final IRI short_synopsis                   = createProperty(NS, "short_synopsis");
  
  /** The sound format of a particular version.*/
  public final IRI sound_format                   = createProperty(NS, "sound_format");
  
  /** Relates a programme to a subject (e.g. `easter').*/
  public final IRI subject                   = createProperty(NS, "subject");
  
  /** Language of the subtitles emebedded in a particular version.*/
  public final IRI subtitle_language                   = createProperty(NS, "subtitle_language");
  
  /** The synopsis of a serie, brand or episode.*/
  public final IRI synopsis                   = createProperty(NS, "synopsis");
  
  /** Associates an episode to a particular tag. */
  public final IRI tag                   = createProperty(NS, "tag");
  
  /** Associates a subtitle event to the corresponding text. */
  public final IRI text                   = createProperty(NS, "text");
  
  /** Associates an episode's version or a version's segment with a temporal interval. 
   * This interval can be associated with a timeline, serving as an anchor for 
   * further temporal annotations, e.g. subtitles or played track.*/
  public final IRI time                   = createProperty(NS, "time");
  
  /** Associates a music segment with a track, as defined in MO. */
  public final IRI track                   = createProperty(NS, "track");
  
  /** Associate an episode to a version of it. Different versions of a same 
   * episode can exist (shortened version, version designed for the hearing impaired, etc.). */
  public final IRI version                   = createProperty(NS, "version");

  private Programme(){
    super(NS);
  }
}
