import{D as e,E as t,H as n,Ht as r,J as i,M as a,N as o,O as s,Q as c,T as l,Vt as ee,X as u,ct as d,j as f,l as te,lt as p,ot as m,q as ne,t as re,w as h,wt as g,y as _,yt as v}from"./client-BPUTdqiR.js";import{t as y}from"./Card-BpETOx86.js";import{t as b}from"./Button-C2tJ4IpD.js";import{t as ie}from"./Select-Ex6xzdaZ.js";import{n as ae,r as oe}from"./es-BEZ2Umea.js";import{t as se}from"./QrCode-D6_WLICr.js";import{tt as x}from"./index-DyRlptq3.js";import{t as ce}from"./HeaderMenu-D1Ch6WdE.js";import{t as S}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{r as C}from"./application-1kkupXkH.js";import{t as le}from"./datetime-BJNH0M1T.js";import{t as ue}from"./useSimplePolling-D-ha1kGW.js";var de={key:0,class:`screen-center`},fe={key:1,class:`screen-page`},pe={key:0,class:`screen-center`},me={key:0,class:`screen-center`},he={key:0,class:`screen-qr`},ge={key:0,class:`media-error`},_e={key:1,class:`screen-media`},ve=[`src`,`muted`],ye=[`src`,`muted`],be={key:3,class:`conclusion-screen`},xe=[`src`,`muted`],Se={key:4,class:`screen-message`},Ce={key:5,class:`screen-message`},we={key:6,class:`screen-message`},Te={key:7,class:`screen-message`},Ee={key:8,class:`timer-screen`},De={class:`timer-label`},Oe={class:`timer-value`},ke={key:10,class:`screen-cover`},Ae=[`src`],je={key:1,class:`cover-controls`},w=`evening-detective-screen-session`,T=S(o({__name:`ScreenPage`,setup(o){let S=re(),T=ae(),E=oe(),D=te(),O=v(``),k=v(``),A=v(),j=v([]),M=v([]),N=v(),P,F=!1,I=v([]),L=v(null),R=v(!1),z=v(``),B=v(!0),V=v(!1),H=v(!1),U=v(Date.now()),W=v(0),G=v(Date.now()),Me=v(),Ne=v(!1),K=v(),q=v(),J=v(),Pe=0,Y=null,X=h(()=>!!(D.query.screenID&&D.query.accessToken)),Fe=h(()=>{if(!O.value||!k.value)return``;let e=new URL(`/screen`,window.location.origin);return e.searchParams.set(`screenId`,O.value),e.searchParams.set(`accessToken`,k.value),e.toString()}),Ie=h(()=>I.value.map(e=>({label:`${le(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.ID}`}`,value:e.ID}))),Z=h(()=>A.value?.mode||`SCREEN_MODE_COVER`),Le=h(()=>A.value?.timerState===`SCREEN_TIMER_STATE_RUNNING`?Math.max(0,W.value-(U.value-G.value)/1e3):W.value),Re=h(()=>{let e=Math.floor(Le.value/60),t=Math.floor(Le.value%60);return`${String(e).padStart(2,`0`)}:${String(t).padStart(2,`0`)}`}),ze=h(()=>C(A.value?.introAudio)),Be=h(()=>C(A.value?.conclusionVideo)),Ve=h(()=>C((A.value?.music?.playlist?.tracks||[])[A.value?.music?.trackIndex||0]?.filename)),He=h(()=>[A.value?.music?.playlist?.ID,A.value?.music?.trackIndex,A.value?.music?.playback]),Ue=h(()=>{let e=A.value?.backgroundImage||A.value?.coverImage;return e?{backgroundImage:`linear-gradient(rgb(0 0 0 / 55%), rgb(0 0 0 / 55%)), url("${e}")`}:{}});function We(){sessionStorage.setItem(w,JSON.stringify({screenID:O.value,accessToken:k.value}))}function Ge(e){let t=Math.max(0,Number(e?.timerRemainingSeconds||0));if(e?.timerState===`SCREEN_TIMER_STATE_RUNNING`&&Me.value===e.timerState){let e=Math.max(0,W.value-(Date.now()-G.value)/1e3);if(Math.abs(t-e)<=.5)return}W.value=t,G.value=Date.now(),Me.value=e?.timerState}function Ke(){try{let e=JSON.parse(sessionStorage.getItem(w)||`{}`);O.value=e.screenId||``,k.value=e.accessToken||``}catch{sessionStorage.removeItem(w)}}async function qe(){let e=await S.CreateScreenSession({});if(!e.screenID||!e.accessToken)throw Error(`Не удалось создать сессию экрана`);O.value=e.screenID,k.value=e.accessToken,We()}async function Q(e=!0){if(!(!O.value||!k.value))try{let e=await S.GetScreenState({screenID:O.value,accessToken:k.value});A.value=e.state,Ge(A.value),A.value?.gameID&&A.value.mode===`SCREEN_MODE_RESULTS`&&await Je()}catch(t){if(e&&t instanceof Error&&t.message===`unauthorized`){sessionStorage.removeItem(w),O.value=``,k.value=``,await qe(),await Q(!1);return}E.error(t instanceof Error?t.message:`Не удалось получить состояние экрана`)}}async function Je(){if(!O.value||!k.value)return;let e=await S.GetScreenResults({screenID:O.value,accessToken:k.value});if(M.value=e.questions||[],j.value=e.teams||[],!F){F=!0,await n();let e=N.value;e&&(e.scrollTop=e.scrollHeight,P=window.setInterval(()=>{e.scrollTop=Math.max(0,e.scrollTop-32),e.scrollTop===0&&P!=null&&(window.clearInterval(P),P=void 0)},1e3))}}async function Ye(){try{let e=await T.GetGames({});I.value=e.games||[]}catch(e){E.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}ue(()=>{Ne.value&&Q()},1e3),m(A,async e=>{if(!e||!e.command||e.stateVersion===Pe)return;Pe=e.stateVersion||0,await n();let t=Z.value===`SCREEN_MODE_CONCLUSION`?J.value:K.value;t&&(t.currentTime=(e.positionMs||0)/1e3,t.volume=Math.max(0,Math.min(1,(e.volume??100)/100)),e.command!==`SCREEN_COMMAND_SEEK`&&e.command!==`SCREEN_COMMAND_VOLUME`&&(e.command===`SCREEN_COMMAND_PLAY`||e.command===`SCREEN_COMMAND_RESUME`||e.command===`SCREEN_COMMAND_REPLAY`?(e.command===`SCREEN_COMMAND_REPLAY`&&(t.currentTime=0),t.play().catch(()=>{z.value=`Браузер заблокировал воспроизведение. Нажмите «Подготовить экран» на этом устройстве.`})):(e.command===`SCREEN_COMMAND_PAUSE`||e.command===`SCREEN_COMMAND_STOP`)&&t.pause()))});function Xe(e){return e.readyState>=HTMLMediaElement.HAVE_METADATA?Promise.resolve():new Promise(t=>{let n=()=>{e.removeEventListener(`loadedmetadata`,n),e.removeEventListener(`error`,n),t()};e.addEventListener(`loadedmetadata`,n,{once:!0}),e.addEventListener(`error`,n,{once:!0})})}m(He,async(e,t)=>{let r=A.value?.music;if(!r||!r.playlist?.tracks?.length)return;await n();let i=q.value;if(!i)return;let a=!t||e[0]!==t[0]||e[1]!==t[1],o=!t||e[2]!==t[2];!a&&!o||(await Xe(i),i.currentTime=a?0:(r.positionMs||0)/1e3,r.playback===`MUSIC_PLAYBACK_PLAYING`?i.play().catch(()=>{z.value=`Браузер заблокировал воспроизведение музыки. Нажмите «Подготовить экран».`}):i.pause())},{immediate:!0}),m(()=>[A.value?.music?.volume,A.value?.soundEnabled],([e,t])=>{let n=q.value;n&&(n.volume=Math.max(0,Math.min(1,(e??100)/100)),n.muted=!t)},{immediate:!0});async function Ze(){if(!(!O.value||!k.value))try{await S.AdvanceScreenMusic({screenID:O.value,accessToken:k.value})}catch{z.value=`Не удалось синхронизировать музыку. Повторная попытка выполняется автоматически.`}}async function Qe(){if(!(!L.value||!D.query.screenID||!D.query.accessToken)){V.value=!0;try{await T.BindScreen({screenID:String(D.query.screenID),accessToken:String(D.query.accessToken),gameID:L.value}),H.value=!0}catch(e){E.error(e instanceof Error?e.message:`Не удалось привязать экран`)}finally{V.value=!1}}}async function $(){try{await document.documentElement.requestFullscreen?.()}catch{E.warning(`Полноэкранный режим недоступен в этом браузере`)}R.value=!0,await n();for(let e of[K.value,J.value,q.value])if(e){e.muted=!0;try{await e.play(),e.pause(),e.currentTime=0,e.muted=!A.value?.soundEnabled}catch{z.value=`Браузер не разрешил подготовить воспроизведение на этом устройстве.`}}}return ne(async()=>{if(X.value){await Ye(),B.value=!1;return}Ke();try{(!O.value||!k.value)&&await qe(),await Q(),Ne.value=!0,Y=window.setInterval(()=>{U.value=Date.now()},250)}catch(e){E.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{B.value=!1}}),i(()=>{Y!=null&&window.clearInterval(Y),P!=null&&window.clearInterval(P)}),(n,i)=>(u(),s(_,null,[X.value?(u(),s(`div`,de,[a(g(y),{class:`binding-card`,title:`Привязка экрана`},{default:d(()=>[H.value?(u(),s(_,{key:0},[i[1]||=l(`p`,null,`Экран привязан к игре.`,-1),i[2]||=l(`p`,null,`Можно закрыть эту страницу.`,-1)],64)):(u(),s(_,{key:1},[i[4]||=l(`p`,null,`Выберите игру, к которой привязать экран.`,-1),a(g(ie),{value:L.value,"onUpdate:value":i[0]||=e=>L.value=e,options:Ie.value,placeholder:`Игра`},null,8,[`value`,`options`]),a(g(b),{type:`primary`,loading:V.value,disabled:L.value==null,onClick:Qe},{default:d(()=>[...i[3]||=[f(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(u(),s(`div`,fe,[B.value?(u(),s(`div`,pe,`Подготовка экрана…`)):(u(),s(_,{key:1},[A.value?.gameID?(u(),s(`div`,{key:1,class:`screen-content`,style:ee(Ue.value)},[z.value?(u(),s(`p`,ge,r(z.value),1)):e(``,!0),A.value.introAudio?p((u(),s(`div`,_e,[l(`audio`,{ref_key:`introAudioElement`,ref:K,src:ze.value,muted:!A.value.soundEnabled,controls:``},null,8,ve)],512)),[[x,Z.value===`SCREEN_MODE_INTRO`]]):e(``,!0),A.value.music?.playlist?.tracks?.length?(u(),s(`audio`,{key:2,ref_key:`musicAudioElement`,ref:q,src:Ve.value,muted:!A.value.soundEnabled,onEnded:Ze},null,40,ye)):e(``,!0),A.value.conclusionVideo?p((u(),s(`div`,be,[l(`video`,{ref_key:`conclusionVideoElement`,ref:J,src:Be.value,muted:!A.value.soundEnabled,playsinline:``},null,8,xe)],512)),[[x,Z.value===`SCREEN_MODE_CONCLUSION`]]):e(``,!0),Z.value===`SCREEN_MODE_CONCLUSION`&&!A.value.conclusionVideo?(u(),s(`div`,Se,`Видео закрывашки не задано`)):e(``,!0),Z.value===`SCREEN_MODE_INTRO_DONE`?(u(),s(`div`,Ce,`Успехов`)):e(``,!0),Z.value===`SCREEN_MODE_CONCLUSION_DONE`?(u(),s(`div`,we,`Спасибо за игру!`)):e(``,!0),Z.value===`SCREEN_MODE_TEXT`?(u(),s(`div`,Te,r(A.value.text),1)):e(``,!0),Z.value===`SCREEN_MODE_TIMER`?(u(),s(`div`,Ee,[l(`h1`,De,r(A.value.timerLabel||`Перерыв`),1),l(`div`,Oe,r(Re.value),1)])):e(``,!0),Z.value===`SCREEN_MODE_RESULTS`?(u(),s(`div`,{key:9,ref_key:`resultsContainer`,ref:N,class:`results-screen`},[i[11]||=l(`h1`,null,`Результаты`,-1),l(`table`,null,[l(`thead`,null,[l(`tr`,null,[i[7]||=l(`th`,null,`Место`,-1),i[8]||=l(`th`,null,`Команда`,-1),(u(!0),s(_,null,c(M.value,e=>(u(),s(`th`,{key:e.code},r(e.code),1))),128)),i[9]||=l(`th`,null,`Сумма`,-1),i[10]||=l(`th`,null,`Ходы`,-1)])]),l(`tbody`,null,[(u(!0),s(_,null,c(j.value,e=>(u(),s(`tr`,{key:e.team?.ID},[l(`td`,null,r(e.place),1),l(`td`,null,r(e.team?.name),1),(u(!0),s(_,null,c(M.value,t=>(u(),s(`td`,{key:t.code},r(e.answers?.find(e=>e.questionCode===t.code)?.score??0),1))),128)),l(`td`,null,r(e.totalScore),1),l(`td`,null,r(e.actionsCount),1)]))),128))])])],512)):e(``,!0),Z.value===`SCREEN_MODE_COVER`?(u(),s(`div`,ke,[A.value.coverImage?(u(),s(`img`,{key:0,src:A.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,Ae)):e(``,!0),R.value?e(``,!0):(u(),s(`div`,je,[a(g(b),{type:`primary`,onClick:$},{default:d(()=>[...i[12]||=[f(`Подготовить экран`,-1)]]),_:1})]))])):e(``,!0)],4)):(u(),s(`div`,me,[a(g(y),{class:`qr-card`,title:`Подключение экрана`},{default:d(()=>[Fe.value?(u(),s(`div`,he,[a(g(se),{value:Fe.value,size:260,padding:0},null,8,[`value`])])):e(``,!0),i[6]||=l(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),R.value?e(``,!0):(u(),t(g(b),{key:1,type:`primary`,onClick:$},{default:d(()=>[...i[5]||=[f(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),X.value?(u(),t(ce,{key:2,active:`games`})):e(``,!0)],64))}}),[[`__scopeId`,`data-v-cf99ca4a`]]),E=o({__name:`ScreenView`,setup(e){return(e,n)=>(u(),t(T))}});export{E as default};