import{Bn as e,Ct as t,Dt as n,Gt as r,Ot as i,Rt as a,Sn as o,St as s,Wt as ee,Yt as c,_n as l,bt as u,ht as d,kt as f,l as te,on as p,qt as m,rn as h,sn as g,t as ne,wt as _,xt as v,zn as re}from"./client-Cla4nwje.js";import{t as y}from"./Card-4DjzIxun.js";import{r as ie}from"./ui-DEaRtHGn.js";import{t as b}from"./Button-CO8jWHc6.js";import{t as ae}from"./Select-ChJX7zEq.js";import{t as x}from"./_plugin-vue_export-helper-B7eW7EFJ.js";import{t as oe}from"./QrCode-Bpn3d7Xa.js";import{dt as S,i as se,r as ce}from"./index-Ew5kbqon.js";import{t as le}from"./HeaderMenu-JIl2V8pE.js";import{r as C}from"./application-i1Z_D_jG.js";import{t as ue}from"./ScreenPreview-C9-EnGe4.js";import{t as de}from"./datetime-BJNH0M1T.js";import{t as fe}from"./useDeviceContext-Bf2RvCIa.js";var pe={key:0,class:`screen-center`},me={key:1,class:`screen-page`},he={key:0,class:`screen-center`},ge={key:0,class:`screen-center`},_e={key:0,class:`screen-qr`},ve={key:0,class:`media-error`},ye={key:1,class:`screen-media`},be=[`src`,`muted`],xe=[`src`,`muted`],Se={key:3,class:`conclusion-screen`},Ce=[`src`,`muted`],we={key:4,class:`screen-message`},Te={key:6,class:`screen-message`},Ee={key:7,class:`timer-screen`},De={class:`timer-label`},Oe={class:`timer-value`},ke={key:9,class:`screen-cover`},Ae=[`src`],je={key:1,class:`cover-controls`},w=`evening-detective-screen-session`,T=x(f({__name:`ScreenPage`,setup(f){let x=ne(),T=se(),E=ie(),D=te(),O=l(``),k=l(``),A=l(),j=l(),M=-1/0,N=l([]),P=l([]),F=l(),I,L=!1,R=l([]),z=l(null),B=l(!1),V=l(``),H=l(!0),U=l(!1),W=l(!1),Me=l(Date.now()),G=l(0),K=l(Date.now()),Ne=l(),Pe=l(!1),q=l(),J=l(),Y=l(),Fe=0,X=null,Z=u(()=>!!(D.query.screenID&&D.query.accessToken));fe(()=>O.value&&k.value&&!Z.value?{screenID:O.value,accessToken:k.value}:{});let Ie=u(()=>{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()}),Le=u(()=>R.value.map(e=>({label:`${de(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.ID}`}`,value:e.ID}))),Q=u(()=>A.value?.mode||`SCREEN_MODE_COVER`),Re=u(()=>A.value?.timerState===`SCREEN_TIMER_STATE_RUNNING`?Math.max(0,G.value-(Me.value-K.value)/1e3):G.value),ze=u(()=>{let e=Math.floor(Re.value/60),t=Math.floor(Re.value%60);return`${String(e).padStart(2,`0`)}:${String(t).padStart(2,`0`)}`}),Be=u(()=>C(A.value?.introAudio)),Ve=u(()=>C(A.value?.conclusionVideo)),He=u(()=>C((A.value?.music?.playlist?.tracks||[])[A.value?.music?.trackIndex||0]?.filename)),Ue=u(()=>[A.value?.music?.playlist?.ID,A.value?.music?.trackIndex,A.value?.music?.playback,A.value?.music?.stateVersion,A.value?.music?.positionMs]),We=u(()=>{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 Ge(){sessionStorage.setItem(w,JSON.stringify({screenID:O.value,accessToken:k.value}))}function Ke(e){let t=Math.max(0,Number(e?.timerRemainingSeconds||0));if(e?.timerState===`SCREEN_TIMER_STATE_RUNNING`&&Ne.value===e.timerState){let e=Math.max(0,G.value-(Date.now()-K.value)/1e3);if(Math.abs(t-e)<=.5)return}G.value=t,K.value=Date.now(),Ne.value=e?.timerState}function qe(){try{let e=JSON.parse(sessionStorage.getItem(w)||`{}`);O.value=e.screenId||``,k.value=e.accessToken||``}catch{sessionStorage.removeItem(w)}}async function Je(){let e=await x.CreateScreenSession({});if(!e.screenID||!e.accessToken)throw Error(`Не удалось создать сессию экрана`);O.value=e.screenID,k.value=e.accessToken,Ge()}async function $(e=!0){if(!(!O.value||!k.value))try{let e=await x.GetScreenState({screenID:O.value,accessToken:k.value});A.value?.gameID!==e.state?.gameID&&(j.value=void 0,M=-1/0),A.value=e.state,Ke(A.value),A.value?.gameID&&A.value.mode===`SCREEN_MODE_RESULTS`&&await Xe(),A.value?.gameID&&A.value.mode===`SCREEN_MODE_TEAMS`&&Date.now()-M>=5e3&&await Ye()}catch(t){if(e&&t instanceof Error&&t.message===`unauthorized`){sessionStorage.removeItem(w),O.value=``,k.value=``,await Je(),await $(!1);return}E.error(t instanceof Error?t.message:`Не удалось получить состояние экрана`)}}async function Ye(){let e=A.value?.gameID,t=O.value;M=Date.now();let n=await x.GetScreenTeams({screenID:t,accessToken:k.value});A.value?.gameID!==e||O.value!==t||(j.value=(n.teams??[]).map(e=>e.name??``).sort((e,t)=>e.localeCompare(t,`ru`)))}async function Xe(){if(!O.value||!k.value)return;let e=await x.GetScreenResults({screenID:O.value,accessToken:k.value});if(P.value=e.questions||[],N.value=e.teams||[],!L){L=!0,await a();let e=F.value;e&&(e.scrollTop=e.scrollHeight,I=window.setInterval(()=>{e.scrollTop=Math.max(0,e.scrollTop-32),e.scrollTop===0&&I!=null&&(window.clearInterval(I),I=void 0)},1e3))}}async function Ze(){try{let e=await T.GetGames({});R.value=e.games||[]}catch(e){E.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}ce(()=>{Pe.value&&$()},1e3),h(A,async e=>{if(!e||!e.command||e.stateVersion===Fe)return;Fe=e.stateVersion||0,await a();let t=Q.value===`SCREEN_MODE_CONCLUSION`?Y.value:q.value;t&&([`SCREEN_COMMAND_PLAY`,`SCREEN_COMMAND_REPLAY`,`SCREEN_COMMAND_STOP`,`SCREEN_COMMAND_SEEK`].includes(e.command)&&(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(()=>{V.value=`Браузер заблокировал воспроизведение. Нажмите «Подготовить экран» на этом устройстве.`})):(e.command===`SCREEN_COMMAND_PAUSE`||e.command===`SCREEN_COMMAND_STOP`)&&t.pause()))});function Qe(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})})}h(Ue,async(e,t)=>{let n=A.value?.music;if(!n||!n.playlist?.tracks?.length)return;await a();let r=J.value;if(!r)return;let i=!t||e[0]!==t[0]||e[1]!==t[1],o=!t||e[2]!==t[2],s=!!t&&e[3]!==t[3]&&(e[4]??0)<(t[4]??0);!i&&!o&&!s||(await Qe(r),r.currentTime=i?0:(n.positionMs||0)/1e3,n.playback===`MUSIC_PLAYBACK_PLAYING`?r.play().catch(()=>{V.value=`Браузер заблокировал воспроизведение музыки. Нажмите «Подготовить экран».`}):r.pause())},{immediate:!0}),h(()=>[A.value?.music?.volume,A.value?.soundEnabled],([e,t])=>{let n=J.value;n&&(n.volume=Math.max(0,Math.min(1,(e??100)/100)),n.muted=!t)},{immediate:!0});async function $e(){if(!(!O.value||!k.value))try{await x.AdvanceScreenMusic({screenID:O.value,accessToken:k.value})}catch{V.value=`Не удалось синхронизировать музыку. Повторная попытка выполняется автоматически.`}}async function et(){if(!(!z.value||!D.query.screenID||!D.query.accessToken)){U.value=!0;try{await T.BindScreen({screenID:String(D.query.screenID),accessToken:String(D.query.accessToken),gameID:z.value,initializeAudio:!1}),W.value=!0}catch(e){E.error(e instanceof Error?e.message:`Не удалось привязать экран`)}finally{U.value=!1}}}async function tt(){try{await document.documentElement.requestFullscreen?.()}catch{E.warning(`Полноэкранный режим недоступен в этом браузере`)}B.value=!0,await a();for(let e of[q.value,Y.value,J.value])if(e){e.muted=!0;try{await e.play(),e.pause(),e.currentTime=0,e.muted=!A.value?.soundEnabled}catch{V.value=`Браузер не разрешил подготовить воспроизведение на этом устройстве.`}}}return ee(async()=>{if(Z.value){await Ze(),H.value=!1;return}qe();try{(!O.value||!k.value)&&await Je(),await $(),Pe.value=!0,X=window.setInterval(()=>{Me.value=Date.now()},250)}catch(e){E.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{H.value=!1}}),r(()=>{X!=null&&window.clearInterval(X),I!=null&&window.clearInterval(I)}),(r,a)=>(m(),_(d,null,[Z.value?(m(),_(`div`,pe,[i(o(y),{class:`binding-card`,title:`Привязка экрана`},{default:p(()=>[W.value?(m(),_(d,{key:0},[a[1]||=v(`p`,null,`Экран привязан к игре.`,-1),a[2]||=v(`p`,null,`Можно закрыть эту страницу.`,-1)],64)):(m(),_(d,{key:1},[a[4]||=v(`p`,null,`Выберите игру, к которой привязать экран.`,-1),i(o(ae),{value:z.value,"onUpdate:value":a[0]||=e=>z.value=e,options:Le.value,placeholder:`Игра`},null,8,[`value`,`options`]),i(o(b),{type:`primary`,loading:U.value,disabled:z.value==null,onClick:et},{default:p(()=>[...a[3]||=[n(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(m(),_(`div`,me,[H.value?(m(),_(`div`,he,`Подготовка экрана…`)):(m(),_(d,{key:1},[A.value?.gameID?(m(),_(`div`,{key:1,class:`screen-content`,style:re(We.value)},[V.value?(m(),_(`p`,ve,e(V.value),1)):t(``,!0),A.value.introAudio?g((m(),_(`div`,ye,[v(`audio`,{ref_key:`introAudioElement`,ref:q,src:Be.value,muted:!A.value.soundEnabled,controls:``},null,8,be)],512)),[[S,Q.value===`SCREEN_MODE_INTRO`]]):t(``,!0),A.value.music?.playlist?.tracks?.length?(m(),_(`audio`,{key:2,ref_key:`musicAudioElement`,ref:J,src:He.value,muted:!A.value.soundEnabled,onEnded:$e},null,40,xe)):t(``,!0),A.value.conclusionVideo?g((m(),_(`div`,Se,[v(`video`,{ref_key:`conclusionVideoElement`,ref:Y,src:Ve.value,muted:!A.value.soundEnabled,playsinline:``},null,8,Ce)],512)),[[S,Q.value===`SCREEN_MODE_CONCLUSION`]]):t(``,!0),Q.value===`SCREEN_MODE_CONCLUSION`&&!A.value.conclusionVideo?(m(),_(`div`,we,`Видео закрывашки не задано`)):t(``,!0),Q.value===`SCREEN_MODE_QR`||Q.value===`SCREEN_MODE_TEAMS`?(m(),s(ue,{key:5,class:`static-screen`,state:A.value,questions:[],teams:[],"team-names":j.value},null,8,[`state`,`team-names`])):t(``,!0),Q.value===`SCREEN_MODE_TEXT`?(m(),_(`div`,Te,e(A.value.text),1)):t(``,!0),Q.value===`SCREEN_MODE_TIMER`?(m(),_(`div`,Ee,[v(`h1`,De,e(A.value.timerLabel||`Перерыв`),1),v(`div`,Oe,e(ze.value),1)])):t(``,!0),Q.value===`SCREEN_MODE_RESULTS`?(m(),_(`div`,{key:8,ref_key:`resultsContainer`,ref:F,class:`results-screen`},[a[11]||=v(`h1`,null,`Результаты`,-1),v(`table`,null,[v(`thead`,null,[v(`tr`,null,[a[7]||=v(`th`,null,`Место`,-1),a[8]||=v(`th`,null,`Команда`,-1),(m(!0),_(d,null,c(P.value,t=>(m(),_(`th`,{key:t.code},e(t.code),1))),128)),a[9]||=v(`th`,null,`Сумма`,-1),a[10]||=v(`th`,null,`Ходы`,-1)])]),v(`tbody`,null,[(m(!0),_(d,null,c(N.value,t=>(m(),_(`tr`,{key:t.team?.ID},[v(`td`,null,e(t.place),1),v(`td`,null,e(t.team?.name),1),(m(!0),_(d,null,c(P.value,n=>(m(),_(`td`,{key:n.code},e(t.answers?.find(e=>e.questionCode===n.code)?.score??0),1))),128)),v(`td`,null,e(t.totalScore),1),v(`td`,null,e(t.actionsCount),1)]))),128))])])],512)):t(``,!0),Q.value===`SCREEN_MODE_COVER`?(m(),_(`div`,ke,[A.value.coverImage?(m(),_(`img`,{key:0,src:A.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,Ae)):t(``,!0),B.value?t(``,!0):(m(),_(`div`,je,[i(o(b),{type:`primary`,onClick:tt},{default:p(()=>[...a[12]||=[n(`Подготовить экран`,-1)]]),_:1})]))])):t(``,!0)],4)):(m(),_(`div`,ge,[i(o(y),{class:`qr-card`,title:`Подключение экрана`},{default:p(()=>[Ie.value?(m(),_(`div`,_e,[i(o(oe),{value:Ie.value,size:260,padding:0},null,8,[`value`])])):t(``,!0),a[6]||=v(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),B.value?t(``,!0):(m(),s(o(b),{key:1,type:`primary`,onClick:tt},{default:p(()=>[...a[5]||=[n(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),Z.value?(m(),s(le,{key:2,active:`games`})):t(``,!0)],64))}}),[[`__scopeId`,`data-v-b24f21e7`]]),E=f({__name:`ScreenView`,setup(e){return(e,t)=>(m(),s(T))}});export{E as default};