import type {
  TmdbCreditCast,
  TmdbAggregateCreditCast,
  TmdbCreditCrew,
  TmdbExternalIds,
  TmdbVideo,
  TmdbVideoResult,
} from '../api/themoviedb/interfaces';

import { Video } from '../models/Movie';

export interface ProductionCompany {
  id: number;
  logoPath?: string;
  originCountry: string;
  name: string;
  description?: string;
  headquarters?: string;
  homepage?: string;
}

export interface TvNetwork {
  id: number;
  logoPath?: string;
  originCountry?: string;
  name: string;
  headquarters?: string;
  homepage?: string;
}

export interface Keyword {
  id: number;
  name: string;
}

export interface Genre {
  id: number;
  name: string;
}

export interface Cast {
  id: number;
  castId: number;
  character: string;
  creditId: string;
  gender?: number;
  name: string;
  order: number;
  profilePath?: string;
}

export interface Crew {
  id: number;
  creditId: string;
  department: string;
  gender?: number;
  job: string;
  name: string;
  profilePath?: string;
}

export interface ExternalIds {
  imdbId?: string;
  freebaseMid?: string;
  freebaseId?: string;
  tvdbId?: number;
  tvrageId?: string;
  facebookId?: string;
  instagramId?: string;
  twitterId?: string;
}

export const mapCast = (person: TmdbCreditCast): Cast => ({
  castId: person.cast_id,
  character: person.character,
  creditId: person.credit_id,
  id: person.id,
  name: person.name,
  order: person.order,
  gender: person.gender,
  profilePath: person.profile_path,
});

export const mapAggregateCast = (person: TmdbAggregateCreditCast): Cast => ({
  castId: person.cast_id,
  // the first role is the one for which the actor appears the most as
  character: person.roles[0].character,
  creditId: person.roles[0].credit_id,
  id: person.id,
  name: person.name,
  order: person.order,
  gender: person.gender,
  profilePath: person.profile_path,
});

export const mapCrew = (person: TmdbCreditCrew): Crew => ({
  creditId: person.credit_id,
  department: person.department,
  id: person.id,
  job: person.job,
  name: person.name,
  gender: person.gender,
  profilePath: person.profile_path,
});

export const mapExternalIds = (eids: TmdbExternalIds): ExternalIds => ({
  facebookId: eids.facebook_id,
  freebaseId: eids.freebase_id,
  freebaseMid: eids.freebase_mid,
  imdbId: eids.imdb_id,
  instagramId: eids.instagram_id,
  tvdbId: eids.tvdb_id,
  tvrageId: eids.tvrage_id,
  twitterId: eids.twitter_id,
});

export const mapVideos = (videoResult: TmdbVideoResult): Video[] =>
  videoResult?.results.map(({ key, name, size, type, site }: TmdbVideo) => ({
    site,
    key,
    name,
    size,
    type,
    url: siteUrlCreator(site, key),
  }));

const siteUrlCreator = (site: Video['site'], key: string): string =>
  ({
    YouTube: `https://www.youtube.com/watch?v=${key}/`,
  }[site]);