import { Server } from 'socket.io'

import { gameLogger } from '#application/logger'
import { TSocket } from '#application/types'
import { Chat } from '#entities/chat'
import CharacterRepository from '#repositories/characterRepository'
import ChatRepository from '#repositories/chatRepository'
import ZoneRepository from '#repositories/zoneRepository'

class ChatService {
  async sendZoneMessage(io: Server, socket: TSocket, message: string, characterId: number, zoneId: number): Promise<boolean> {
    try {
      const character = await CharacterRepository.getById(characterId)
      if (!character) return false

      const zone = await ZoneRepository.getById(zoneId)
      if (!zone) return false

      const newChat = new Chat()

      newChat.setCharacter(character).setZone(zone).setMessage(message)

      await newChat.save()

      const chat = await ChatRepository.getById(newChat.id)
      if (!chat) return false

      io.to(zoneId.toString()).emit('chat:message', chat)
      return true
    } catch (error: any) {
      gameLogger.error(`Failed to save chat message: ${error instanceof Error ? error.message : String(error)}`)
      return false
    }
  }

  public isCommand(message: string, command?: string) {
    if (command) {
      return message === `/${command}` || message.startsWith(`/${command} `)
    }
    return message.startsWith('/')
  }

  public getArgs(command: string, message: string): string[] | undefined {
    if (!this.isCommand(message, command)) return
    return message.split(`/${command} `)[1].split(' ')
  }
}

export default ChatService