<template>
  <section class="controller-page">
    <!-- Barra di stato connessione -->
    <div class="conn-bar" :class="{ connected: wsConnected }">
      <span class="dot"></span>
      {{ wsConnected ? 'Connesso' : 'Connessione...' }}
    </div>

    <!-- Anteprima punteggio -->
    <div class="score-preview">
      <div class="team-score home-bg" @click="sendAction({ type: 'incPunt', team: 'home' })">
        <div class="team-name">{{ state.sp.nomi.home }}</div>
        <div class="team-pts">{{ punt.home }}</div>
        <div class="team-set">SET {{ set.home }}</div>
        <img v-show="servHome" src="/serv.png" class="serv-icon" alt="Servizio" />
      </div>
      <div class="team-score guest-bg" @click="sendAction({ type: 'incPunt', team: 'guest' })">
        <div class="team-name">{{ state.sp.nomi.guest }}</div>
        <div class="team-pts">{{ punt.guest }}</div>
        <div class="team-set">SET {{ set.guest }}</div>
        <img v-show="!servHome" src="/serv.png" class="serv-icon" alt="Servizio" />
      </div>
    </div>

    <!-- Riga annulla punto -->
    <div class="undo-row">
      <button class="btn btn-undo" @click="sendAction({ type: 'decPunt' })">
        ANNULLA PUNTO
      </button>
    </div>

    <!-- Pulsanti set -->
    <div class="action-row">
      <button class="btn btn-set home-bg" @click="sendAction({ type: 'incSet', team: 'home' })">
        SET {{ state.sp.nomi.home }}
      </button>
      <button class="btn btn-set guest-bg" @click="sendAction({ type: 'incSet', team: 'guest' })">
        SET {{ state.sp.nomi.guest }}
      </button>
    </div>

    <!-- Controlli principali -->
    <div class="controls">
      <button class="btn btn-ctrl" @click="sendAction({ type: 'cambiaPalla' })" :disabled="!isPunteggioZeroZero">
        Cambio Palla
      </button>
      <button class="btn btn-ctrl" @click="sendAction({ type: 'toggleFormazione' })">
        {{ state.visuForm ? 'Punteggio' : 'Formazioni' }}
      </button>
      <button class="btn btn-ctrl" @click="sendAction({ type: 'toggleStriscia' })">
        Striscia
      </button>
      <button class="btn btn-ctrl" @click="sendAction({ type: 'toggleOrder' })">
        Inverti
      </button>
      <button class="btn btn-ctrl" @click="speak()">
        Voce
      </button>
      <button class="btn btn-ctrl" @click="openConfig()">
        Config
      </button>
      <button class="btn btn-ctrl" @click="openCambiTeam()">
        Cambi
      </button>
      <button class="btn btn-danger" @click="confirmReset = true">
        Reset
      </button>
    </div>

    <!-- Finestra conferma reset -->
    <div class="overlay" v-if="confirmReset" @click.self="confirmReset = false">
      <div class="dialog">
        <div class="dialog-title">Azzero punteggio?</div>
        <div class="dialog-buttons">
          <button class="btn btn-cancel" @click="confirmReset = false">NO</button>
          <button class="btn btn-confirm" @click="doReset()">SI</button>
        </div>
      </div>
    </div>

    <!-- Finestra set vinto / partita finita -->
    <div class="overlay" v-if="showSetVinto">
      <div class="dialog">
        <div class="dialog-title">{{ isPartitaFinita ? 'PARTITA FINITA' : 'SET VINTO' }}</div>
        <div class="dialog-winner">{{ state.sp.nomi[setVintoTeam] }}</div>
        <div class="dialog-subtitle" v-if="!isPartitaFinita">Configura le formazioni per il prossimo set</div>
        <div class="dialog-buttons">
          <button class="btn btn-cancel" @click="undoUltimoPoint()">INDIETRO</button>
          <button v-if="isPartitaFinita" class="btn btn-confirm" @click="showSetVinto = false">CHIUDI</button>
          <button v-else class="btn btn-confirm" @click="doNuovoSet()">VAI AL SET SUCCESSIVO</button>
        </div>
      </div>
    </div>

    <!-- Finestra configurazione -->
    <div class="overlay" v-if="showConfig" @click.self="showConfig = false">
      <div class="dialog dialog-config">
        <div class="dialog-title">Configurazione</div>

        <div class="form-group">
          <label>Nome Home</label>
          <input type="text" v-model="configData.nomeHome" class="input-field" />
        </div>
        <div class="form-group">
          <label>Nome Guest</label>
          <input type="text" v-model="configData.nomeGuest" class="input-field" />
        </div>

        <div class="form-group">
          <label>Modalità partita</label>
          <div class="mode-buttons">
            <button :class="['btn', 'btn-mode', configData.modalita === '2/3' ? 'active' : '']"
              @click="configData.modalita = '2/3'">2/3</button>
            <button :class="['btn', 'btn-mode', configData.modalita === '3/5' ? 'active' : '']"
              @click="configData.modalita = '3/5'">3/5</button>
            <button :class="['btn', 'btn-mode', configData.modalita === 'amichevole' ? 'active' : '']"
              @click="configData.modalita = 'amichevole'">Amichevole</button>
          </div>
        </div>

        <div class="form-group">
          <label>Formazione Home</label>
          <div class="form-grid">
            <div class="form-row">
              <input type="text" v-model="configData.formHome[3]" class="input-num" />
              <input type="text" v-model="configData.formHome[2]" class="input-num" />
              <input type="text" v-model="configData.formHome[1]" class="input-num" />
            </div>
            <div class="form-line"></div>
            <div class="form-row">
              <input type="text" v-model="configData.formHome[4]" class="input-num" />
              <input type="text" v-model="configData.formHome[5]" class="input-num" />
              <input type="text" v-model="configData.formHome[0]" class="input-num" />
            </div>
          </div>
        </div>

        <div class="form-group">
          <label>Formazione Guest</label>
          <div class="form-grid">
            <div class="form-row">
              <input type="text" v-model="configData.formGuest[3]" class="input-num" />
              <input type="text" v-model="configData.formGuest[2]" class="input-num" />
              <input type="text" v-model="configData.formGuest[1]" class="input-num" />
            </div>
            <div class="form-line"></div>
            <div class="form-row">
              <input type="text" v-model="configData.formGuest[4]" class="input-num" />
              <input type="text" v-model="configData.formGuest[5]" class="input-num" />
              <input type="text" v-model="configData.formGuest[0]" class="input-num" />
            </div>
          </div>
        </div>

        <div class="dialog-buttons">
          <button class="btn btn-cancel" @click="showConfig = false">Annulla</button>
          <button class="btn btn-confirm" @click="saveConfig()">OK</button>
        </div>
      </div>
    </div>

    <!-- Selezione squadra per cambi -->
    <div class="overlay" v-if="showCambiTeam" @click.self="showCambiTeam = false">
      <div class="dialog">
        <div class="dialog-title">Scegli squadra</div>
        <div class="dialog-buttons">
          <button class="btn btn-set home-bg" @click="openCambi('home')">{{ state.sp.nomi.home }}</button>
          <button class="btn btn-set guest-bg" @click="openCambi('guest')">{{ state.sp.nomi.guest }}</button>
        </div>
      </div>
    </div>

    <!-- Finestra gestione cambi -->
    <div class="overlay" v-if="showCambi" @click.self="closeCambi()">
      <div class="dialog">
        <div class="dialog-title">{{ state.sp.nomi[cambiTeam] }}: CAMBIO</div>
        <div class="cambi-container">
          <div class="cambio-row" v-for="(c, i) in cambiData" :key="i">
            <input type="text" v-model="c.in" placeholder="IN" class="input-num cambi-in-field" />
            <span class="cambio-arrow">→</span>
            <input type="text" v-model="c.out" placeholder="OUT" class="input-num cambi-out-field" />
          </div>
        </div>
        <div v-if="cambiError" class="cambi-error">{{ cambiError }}</div>
        <div class="dialog-buttons">
          <button class="btn btn-cancel" @click="closeCambi()">Annulla</button>
          <button class="btn btn-confirm" :disabled="!cambiValid" @click="confermaCambi()">CONFERMA</button>
        </div>
      </div>
    </div>
  </section>
</template>

<script>
import { createWsMixin } from '../wsMixin.js'

export default {
  name: "ControllerPage",
  mixins: [createWsMixin('controller')],
  data() {
    return {
      confirmReset: false,
      showSetVinto: false,
      setVintoTeam: null,
      showConfig: false,
      showCambiTeam: false,
      showCambi: false,
      cambiTeam: "home",
      cambiData: [{ in: "", out: "" }, { in: "", out: "" }],
      cambiError: "",
      configData: {
        nomeHome: "", nomeGuest: "", modalita: "3/5",
        formHome: ["1", "2", "3", "4", "5", "6"],
        formGuest: ["1", "2", "3", "4", "5", "6"],
      },
    }
  },
  computed: {
    isPunteggioZeroZero() {
      return this.state.sp.striscia.at(-1).ris === ''
    },
    squadraVincente() {
      const { home, guest } = this.punt
      const sv = this.set
      const totSet = sv.home + sv.guest
      const isSetDecisivo = this.state.modalitaPartita === '2/3' ? totSet >= 2 : totSet >= 4
      const soglia = isSetDecisivo ? 15 : 25
      if (home >= soglia && home - guest >= 2) return 'home'
      if (guest >= soglia && guest - home >= 2) return 'guest'
      return null
    },
    isPartitaFinita() {
      if (!this.setVintoTeam || this.state.modalitaPartita === 'amichevole') return false
      const setsToWin = this.state.modalitaPartita === '2/3' ? 2 : 3
      return this.set[this.setVintoTeam] + 1 >= setsToWin
    },
    cambiValid() {
      let hasComplete = false
      for (const c of this.cambiData) {
        const cin = (c.in || "").trim(), cout = (c.out || "").trim()
        if (!cin && !cout) continue
        if (!cin || !cout) return false
        hasComplete = true
      }
      return hasComplete
    },
  },
  watch: {
    squadraVincente(val) {
      if (val && !this.showSetVinto) {
        this.setVintoTeam = val
        this.showSetVinto = true
      }
    },
  },
  methods: {
    onWsMessage(msg) {
      if (msg.type === 'error') this.showErrorFeedback(msg.message)
    },
    sendAction(action) {
      if (!action?.type) return
      if (!this.sendWs({ type: 'action', action })) this.showErrorFeedback('Non connesso al server')
    },
    showErrorFeedback(message) {
      console.error('[Controller] Error:', message)
    },
    doReset() {
      this.sendAction({ type: 'resetta' })
      this.confirmReset = false
    },
    undoUltimoPoint() {
      this.sendAction({ type: 'decPunt' })
      this.showSetVinto = false
    },
    doNuovoSet() {
      this.sendAction({ type: 'nuovoSet', team: this.setVintoTeam })
      this.showSetVinto = false
      this.configData = {
        nomeHome: this.state.sp.nomi.home,
        nomeGuest: this.state.sp.nomi.guest,
        modalita: this.state.modalitaPartita,
        formHome: ["1", "2", "3", "4", "5", "6"],
        formGuest: ["1", "2", "3", "4", "5", "6"],
      }
      this.showConfig = true
    },
    openConfig() {
      this.configData = {
        nomeHome: this.state.sp.nomi.home,
        nomeGuest: this.state.sp.nomi.guest,
        modalita: this.state.modalitaPartita,
        formHome: [...this.state.sp.form.home],
        formGuest: [...this.state.sp.form.guest],
      }
      this.showConfig = true
    },
    saveConfig() {
      this.sendAction({ type: 'setNomi', home: this.configData.nomeHome, guest: this.configData.nomeGuest })
      this.sendAction({ type: 'setModalita', modalita: this.configData.modalita })
      this.sendAction({ type: 'setFormazione', team: 'home', form: this.configData.formHome })
      this.sendAction({ type: 'setFormazione', team: 'guest', form: this.configData.formGuest })
      this.showConfig = false
    },
    openCambiTeam() { this.showCambiTeam = true },
    openCambi(team) {
      this.showCambiTeam = false
      this.cambiTeam = team
      this.cambiData = [{ in: "", out: "" }, { in: "", out: "" }]
      this.cambiError = ""
      this.showCambi = true
    },
    closeCambi() {
      this.showCambi = false
      this.cambiData = [{ in: "", out: "" }, { in: "", out: "" }]
      this.cambiError = ""
    },
    confermaCambi() {
      if (!this.cambiValid) return
      this.cambiError = ""
      const cambi = this.cambiData
        .filter(c => (c.in || "").trim() && (c.out || "").trim())
        .map(c => ({ in: c.in.trim(), out: c.out.trim() }))
      const formSimulata = this.state.sp.form[this.cambiTeam].map(v => String(v).trim())
      for (const cambio of cambi) {
        if (!/^\d+$/.test(cambio.in) || !/^\d+$/.test(cambio.out)) {
          this.cambiError = "I numeri dei giocatori devono essere cifre"; return
        }
        if (cambio.in === cambio.out) {
          this.cambiError = `Il giocatore ${cambio.in} non può sostituire sé stesso`; return
        }
        if (formSimulata.includes(cambio.in)) {
          this.cambiError = `Il giocatore ${cambio.in} è già in formazione`; return
        }
        if (!formSimulata.includes(cambio.out)) {
          this.cambiError = `Il giocatore ${cambio.out} non è in formazione`; return
        }
        formSimulata.splice(formSimulata.indexOf(cambio.out), 1, cambio.in)
      }
      this.sendAction({ type: 'confermaCambi', team: this.cambiTeam, cambi })
      this.closeCambi()
    },
    speak() {
      const { home, guest } = this.punt
      const text = home + guest === 0 ? "zero a zero"
        : home === guest ? `${home} pari`
        : this.servHome ? `${home} a ${guest}` : `${guest} a ${home}`
      this.sendWs({ type: 'speak', text })
    },
  },
}
</script>

<style scoped>
.controller-page {
  min-height: 100vh;
  background: #111;
  color: #fff;
  padding: 8px;
  padding-top: 36px;
  font-family: 'Inter', system-ui, sans-serif;
  -webkit-user-select: none;
  user-select: none;
}

/* Barra stato connessione */
.conn-bar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  font-size: 12px;
  font-weight: 600;
  background: #c62828;
  color: white;
  z-index: 200;
  transition: background 0.3s;
}
.conn-bar.connected {
  background: #2e7d32;
}
.dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: white;
}

/* Anteprima punteggio */
.score-preview {
  display: flex;
  gap: 8px;
  margin-bottom: 8px;
}
.team-score {
  flex: 1;
  border-radius: 16px;
  padding: 16px 12px;
  text-align: center;
  cursor: pointer;
  position: relative;
  transition: transform 0.1s;
  min-height: 120px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
.team-score:active {
  transform: scale(0.97);
}
.home-bg {
  background: linear-gradient(145deg, #1a1a1a, #333);
  border: 2px solid #fdd835;
  color: #fdd835;
}
.guest-bg {
  background: linear-gradient(145deg, #0d47a1, #1565c0);
  border: 2px solid #64b5f6;
  color: #fff;
}
.team-name {
  font-size: 14px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 1px;
  margin-bottom: 4px;
}
.team-pts {
  font-size: 56px;
  font-weight: 900;
  line-height: 1;
}
.team-set {
  font-size: 13px;
  font-weight: 600;
  opacity: 0.75;
  margin-top: 4px;
}
.serv-icon {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 20px;
  height: 20px;
}

/* Riga annulla punto */
.undo-row {
  margin-bottom: 8px;
}
.btn-undo {
  width: 100%;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.2);
  color: #ffab91;
  padding: 10px;
  font-size: 14px;
  font-weight: 700;
  border-radius: 12px;
  cursor: pointer;
}
.btn-undo:active {
  background: rgba(255,100,50,0.2);
}

/* Pulsanti set */
.action-row {
  display: flex;
  gap: 8px;
  margin-bottom: 8px;
}
.btn-set {
  flex: 1;
  padding: 12px;
  font-size: 13px;
  font-weight: 700;
  border-radius: 12px;
  cursor: pointer;
  border: none;
  text-transform: uppercase;
}
.btn-set:active {
  transform: scale(0.97);
}

/* Griglia controlli */
.controls {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 8px;
}

.btn {
  border: none;
  font-family: inherit;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.btn-ctrl {
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.15);
  color: #e0e0e0;
  padding: 14px 8px;
  font-size: 14px;
  font-weight: 600;
  border-radius: 12px;
  transition: background 0.15s;
}
.btn-ctrl:active {
  background: rgba(255,255,255,0.18);
}
.btn-ctrl:disabled {
  opacity: 0.35;
}

.btn-danger {
  background: rgba(198, 40, 40, 0.25);
  border: 1px solid rgba(239, 83, 80, 0.4);
  color: #ff8a80;
  padding: 14px 8px;
  font-size: 14px;
  font-weight: 600;
  border-radius: 12px;
}
.btn-danger:active {
  background: rgba(198, 40, 40, 0.45);
}

/* Overlay e finestre modali */
.overlay {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0,0,0,0.75);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 300;
  padding: 16px;
}

.dialog {
  background: #1e1e1e;
  border-radius: 20px;
  padding: 24px;
  width: 100%;
  max-width: 400px;
  border: 1px solid rgba(255,255,255,0.12);
}

.dialog-winner {
  font-size: 28px;
  font-weight: 900;
  text-align: center;
  margin-bottom: 8px;
}

.dialog-subtitle {
  font-size: 13px;
  color: #aaa;
  text-align: center;
  margin-bottom: 4px;
}

.dialog-config {
  max-height: 85vh;
  overflow-y: auto;
}

.dialog-title {
  font-size: 18px;
  font-weight: 800;
  text-align: center;
  margin-bottom: 20px;
  padding-bottom: 12px;
  border-bottom: 1px solid rgba(255,255,255,0.12);
}

.dialog-buttons {
  display: flex;
  gap: 12px;
  margin-top: 20px;
}

.btn-cancel {
  flex: 1;
  background: rgba(255,255,255,0.08);
  color: #aaa;
  padding: 12px;
  border-radius: 12px;
  font-size: 15px;
  font-weight: 600;
}

.btn-confirm {
  flex: 1;
  background: #2e7d32;
  color: white;
  padding: 12px;
  border-radius: 12px;
  font-size: 15px;
  font-weight: 700;
}
.btn-confirm:disabled {
  opacity: 0.4;
}

/* Gruppi form */
.form-group {
  margin-bottom: 16px;
}
.form-group label {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: #aaa;
  margin-bottom: 6px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.input-field {
  width: 100%;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.2);
  color: white;
  padding: 10px 14px;
  border-radius: 10px;
  font-size: 16px;
  box-sizing: border-box;
}
.input-field:focus {
  outline: none;
  border-color: #64b5f6;
}

.input-num {
  width: 52px;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.2);
  color: white;
  padding: 8px;
  border-radius: 8px;
  font-size: 18px;
  text-align: center;
  box-sizing: border-box;
}
.input-num:focus {
  outline: none;
  border-color: #64b5f6;
}

/* Griglia formazione */
.form-grid {
  background: rgba(205, 133, 63, 0.15);
  border: 2px solid rgba(255,255,255,0.15);
  border-radius: 12px;
  padding: 12px;
}
.form-row {
  display: flex;
  justify-content: center;
  gap: 10px;
  padding: 8px 0;
}
.form-line {
  border-top: 1px dashed rgba(255,255,255,0.3);
  margin: 4px 0;
}

/* Pulsanti modalita */
.mode-buttons {
  display: flex;
  gap: 8px;
}
.btn-mode {
  flex: 1;
  padding: 10px;
  background: rgba(255,255,255,0.08);
  color: #aaa;
  border-radius: 10px;
  font-size: 16px;
  font-weight: 700;
  transition: all 0.15s;
}
.btn-mode.active {
  background: #2e7d32;
  color: white;
}

/* Sezione cambi */
.cambi-container {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 8px 0;
}
.cambio-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
}
.cambio-arrow {
  font-size: 20px;
  font-weight: 700;
  color: #aaa;
}
.cambi-in-field {
  background: rgba(120, 200, 120, 0.2) !important;
  border-color: rgba(120, 200, 120, 0.4) !important;
}
.cambi-out-field {
  background: rgba(200, 120, 120, 0.2) !important;
  border-color: rgba(200, 120, 120, 0.4) !important;
}
.cambi-error {
  color: #ff6b6b;
  font-size: 14px;
  text-align: center;
  padding: 8px 0;
  font-weight: 600;
}
</style>
