import { useGameRepairMutation, useGameResetMutation, useGameStartMutation, useGameStopMutation, useGameSwitchPlayerMutation } from '@/hooks/mutations/useGameMutation'
import { useAuth } from '@/hooks/useAuth'
import { useGame, useUpdateGameState } from '@/hooks/useGame'
import { useRouter } from 'expo-router'
import { useState } from 'react'
import { Button, Dialog, FAB, List, Portal, Surface, Text } from 'react-native-paper'

export default function HistoryScreen() {
  const router = useRouter()
  const auth = useAuth()
  const game = useGame()
  const updateGameState = useUpdateGameState()

  const gameStartMutation = useGameStartMutation({
    auth,
    updateGameState,
  })
  const gameStopMutation = useGameStopMutation({
    auth,
    updateGameState,
  })
  const gameSwitchMutation = useGameSwitchPlayerMutation({
    auth,
    updateGameState,
  })
  const gameRepairMutation = useGameRepairMutation({
    auth,
    updateGameState,
  })
  const gameResetMutation = useGameResetMutation({
    auth,
    updateGameState,
  })

  const [resetConfirmVisible, setResetConfirmVisible] = useState(false)

  return (
    <Surface
      style={{ flex: 1 }}>
      <List.Section title={"Paramètres"}>
        <List.Item
            key={"login"}
            title="Connexion au serveur"
            description={auth.loggedIn ? "Vous êtes déjà connecté⋅e" : "Vous n'êtes pas connecté⋅e"}
            right={() => <FAB icon="login" size="small" onPress={() => router.navigate('/login')} />}
            onPress={() => router.navigate('/login')} />
      </List.Section>
      <List.Section title={"Gestion du jeu"}>
        <List.Item
            key={"start"}
            title="Démarrer le jeu"
            disabled={game.gameStarted}
            right={() => <FAB icon="play" size="small" disabled={game.gameStarted} />}
            onPress={() => gameStartMutation.mutate()} />
        <List.Item
            key={"stop"}
            title="Arrêter le jeu"
            disabled={!game.gameStarted}
            right={() => <FAB icon="stop" size="small" disabled={!game.gameStarted} />}
            onPress={() => gameStopMutation.mutate()} />
        <List.Item
            key={"switch"}
            title="Changer de joueur⋅se en course"
            description="À utiliser après une capture"
            disabled={!game.gameStarted}
            right={() => <FAB icon="exit-run" size="small" disabled={!game.gameStarted} />}
            onPress={() => gameSwitchMutation.mutate()} />
      </List.Section>
      <List.Section title={"Avancé"}>
        <List.Item
            key={"repair"}
            title="Réparer"
            description="Permet de réparer les soldes des joueur⋅ses à partir des défis réalisés et des trains emprunter. À manipuler avec précaution."
            right={() => <FAB icon="reload-alert" size="small" variant={'tertiary'} />}
            onPress={() => gameRepairMutation.mutate()} />
        <List.Item
            key={"reset"}
            title="Réinitialiser les données de jeu"
            description="Permet de détruire toutes les données. À manipuler avec précaution."
            right={() => <FAB icon="reload-alert" size="small" variant={'tertiary'} />}
            onPress={() => setResetConfirmVisible(true)} />
      </List.Section>
      <Portal>
        <Dialog key="confirmReset" visible={resetConfirmVisible} onDismiss={() => setResetConfirmVisible(false)}>
          <Dialog.Title>Confirmer</Dialog.Title>
          <Dialog.Content>
            <Text variant="bodyMedium">
              Cette action va réinitialiser TOUTES les données de jeu : l'historique des positions, les défis réalisés et les trains empruntés.
              Êtes-vous réellement sûr⋅e de vouloir tout supprimer ?
            </Text>
          </Dialog.Content>
          <Dialog.Actions>
            <Button onPress={() => setResetConfirmVisible(false)}>Annuler</Button>
            <Button onPress={() => { setResetConfirmVisible(false); gameResetMutation.mutate() }}>Confirmer</Button>
          </Dialog.Actions>
        </Dialog>
      </Portal>
    </Surface>
  )
}
