export type InteractiveWistiaPlayerElement=HTMLElement&{currentTime:number;duration:number};

type WistiaPlayerOptions={title?:string;initialTime?:number;playerColor?:string};

const WISTIA_PLAYER_SRC='https://fast.wistia.com/player.js';
const mediaLoads=new Map<string,Promise<void>>();
let playerLoad:Promise<void>|undefined;

function loadScript(src:string,{module=false,marker}:{module?:boolean;marker:string}):Promise<void>{
  if(typeof document==='undefined')return Promise.reject(new Error('wistia_browser_required'));
  const existing=Array.from(document.scripts).find(script=>script.src===src);
  if(existing)return Promise.resolve();
  return new Promise((resolve,reject)=>{
    const script=document.createElement('script');
    script.src=src;
    script.async=true;
    if(module)script.type='module';
    script.dataset[marker]='1';
    script.addEventListener('load',()=>resolve(),{once:true});
    script.addEventListener('error',()=>reject(new Error('wistia_script_load_failed')),{once:true});
    document.head.append(script);
  });
}

export function ensureWistiaPlayerAssets(mediaId:string):Promise<void>{
  if(typeof window==='undefined'||typeof document==='undefined')return Promise.reject(new Error('wistia_browser_required'));
  if(!playerLoad)playerLoad=loadScript(WISTIA_PLAYER_SRC,{marker:'interactiveLearnWistiaPlayer'}).then(async()=>{await customElements.whenDefined('wistia-player')});
  let mediaLoad=mediaLoads.get(mediaId);
  if(!mediaLoad){
    mediaLoad=loadScript(`https://fast.wistia.com/embed/${encodeURIComponent(mediaId)}.js`,{module:true,marker:'interactiveLearnWistiaMedia'});
    mediaLoads.set(mediaId,mediaLoad);
  }
  return Promise.all([playerLoad,mediaLoad]).then(()=>undefined);
}

export function createWistiaPlayerElement(mediaId:string,options:WistiaPlayerOptions={}):InteractiveWistiaPlayerElement{
  const player=document.createElement('wistia-player') as InteractiveWistiaPlayerElement;
  player.setAttribute('media-id',mediaId);
  player.setAttribute('aspect','1.7777777777777777');
  player.setAttribute('player-color',options.playerColor||'ffd432');
  player.setAttribute('aria-label',options.title||'Wistia video');
  if(options.initialTime&&options.initialTime>0)player.setAttribute('current-time',String(options.initialTime));
  player.style.setProperty('--learnitive-wistia-swatch',`url("https://fast.wistia.com/embed/medias/${encodeURIComponent(mediaId)}/swatch")`);
  return player;
}
