import { TranslationSchema } from '../types';

/**
 * 한국어 번역 파일.
 * 모든 키가 en.ts와 1:1 대응되어야 합니다.
 */
export const ko: TranslationSchema = {
  // ── 에러 메시지 ─────────────────────────────────────────
  errors: {
    E1001: {
      userMessage: '사용자 제한 값이 올바르지 않습니다.',
      resolution: '0에서 99 사이의 숫자를 입력해주세요. (0 = 무제한)',
    },
    E1002: {
      userMessage: '채널 이름 형식이 올바르지 않습니다.',
      resolution: '유효한 채널 이름을 입력해주세요. (최대 100자)',
    },
    E1003: {
      userMessage: '자기 자신에게는 이 작업을 수행할 수 없습니다.',
    },
    E1004: {
      userMessage: '선택한 유저가 음성 채널에 없습니다.',
      resolution: '작업을 수행하기 전에 해당 유저가 채널에 있는지 확인해주세요.',
    },
    E2001: {
      userMessage: '봇에 채널을 관리할 권한이 부족합니다.',
      resolution: '서버 관리자에게 봇의 "채널 관리" 권한을 확인해달라고 요청하세요.',
    },
    E2002: {
      userMessage: '봇에 음성 채널 관련 권한이 부족합니다.',
      resolution: '서버 관리자에게 봇의 "채널 관리", "역할 관리", "멤버 이동" 권한을 확인해달라고 요청하세요.',
    },
    E2003: {
      userMessage: '이 명령어를 사용할 권한이 없습니다.',
      resolution: '이 명령어는 관리자 권한이 필요합니다.',
    },
    E2004: {
      userMessage: '채널 소유자만 이 기능을 사용할 수 있습니다.',
    },
    E2005: {
      userMessage: '활성된 임시 음성 채널에 참여 중이어야 사용할 수 있습니다.',
      resolution: '임시 음성 채널에 참여한 뒤 다시 시도해주세요.',
    },
    E3001: {
      userMessage: '요청을 처리하는 중 내부 오류가 발생했습니다.',
      resolution: '잠시 후 다시 시도해주세요. 문제가 지속되면 봇 관리자에게 문의하세요.',
    },
    E3002: {
      userMessage: '요청을 처리하는 중 내부 오류가 발생했습니다.',
      resolution: '잠시 후 다시 시도해주세요.',
    },
    E3003: {
      userMessage: '명령어를 실행하는 중 오류가 발생했습니다.',
      resolution: '다시 시도해주세요. 문제가 지속되면 봇 관리자에게 문의하세요.',
    },
    E3999: {
      userMessage: '예상치 못한 오류가 발생했습니다.',
      resolution: '나중에 다시 시도해주세요. 문제가 계속되면 봇 관리자에게 문의하세요.',
    },
    E4001: {
      userMessage: 'Discord에 의해 요청이 제한되었습니다.',
      resolution: '잠시 기다린 후 다시 시도해주세요.',
    },
    E4002: {
      userMessage: '권한 부족으로 Discord가 작업을 거부했습니다.',
      resolution: '서버 관리자에게 봇의 역할 및 채널 권한을 확인해달라고 요청하세요.',
    },
    E4003: {
      userMessage: 'Discord에 일시적인 문제가 발생했습니다.',
      resolution: '잠시 후 다시 시도해주세요. 문제가 지속되면 https://discordstatus.com 에서 상태를 확인해주세요.',
    },
  },

  // ── 에러 카테고리 타이틀 ────────────────────────────────
  errorTitles: {
    USER_INPUT: '입력을 확인해주세요',
    PERMISSION: '권한이 부족합니다',
    BOT_INTERNAL: '문제가 발생했습니다',
    DISCORD_API: '일시적인 문제입니다',
  },

  // ── 에러 Embed 필드 라벨 ────────────────────────────────
  errorFields: {
    resolution: '💡 해결 방법',
  },

  // ── 음성 채널 ───────────────────────────────────────────
  voice: {
    channelReady: '{{owner}}, 임시 채널이 준비되었습니다! 아래 드롭다운 메뉴로 관리하세요.',
    defaultRoomName: '{{username}}의 방',
    controlPanel: {
      placeholder: '⚙️ 채널 설정 관리',
      rename: '채널 이름 변경',
      limit: '인원 제한 설정',
      lock: '채널 잠금 / 해제',
      kick: '유저 추방',
      ban: '유저 차단 / 숨기기',
      transfer: '소유권 이전',
    },
    responses: {
      channelLocked: '채널이 잠겼습니다! 초대된 멤버만 참여할 수 있습니다.',
      channelUnlocked: '채널이 해제되었습니다! 누구나 참여할 수 있습니다.',
      channelRenamed: '채널 이름이 **{{name}}**(으)로 변경되었습니다!',
      limitSet: '인원 제한이 **{{limit}}**명으로 설정되었습니다!',
      limitUnlimited: '무제한',
      kicked: '{{user}}을(를) 채널에서 추방했습니다.',
      banned: '{{user}}에게 채널을 숨기고 차단했습니다.',
      transferPrompt: '채널의 새 소유자를 선택하세요.',
      transferDone: '소유권이 {{user}}에게 이전되었습니다.',
      banPrompt: '차단하면 해당 유저에게 채널이 보이지 않게 됩니다.',
    },
  },

  // ── 명령어 ──────────────────────────────────────────────
  commands: {
    voiceSetup: {
      description: '임시 음성 채널을 위한 생성기 채널을 설정합니다.',
      setDescription: '기존 음성 채널을 생성기로 설정합니다',
      createDescription: '새 음성 채널을 만들고 생성기로 설정합니다',
      channelOptionDescription: '생성기로 사용할 음성 채널',
      categoryOptionDescription: '(선택) 임시 채널이 생성될 카테고리',
      nameOptionDescription: '새 생성기 음성 채널의 이름',
      setSuccess: '{{channel}}을(를) 음성 생성기 채널로 설정했습니다!',
      createSuccess: '{{channel}}을(를) 음성 생성기 채널로 생성 및 설정했습니다!',
    },
    voiceConfig: {
      description: '서버의 임시 음성 채널 설정을 관리합니다.',
      setNameTitle: '기본 이름 템플릿 설정',
      setNameDesc: '임시 채널 생성 시 사용할 기본 이름 형식을 설정합니다. (사용자명: {{username}})',
      setLimitTitle: '기본 인원 제한 설정',
      setLimitDesc: '임시 채널 생성 시 적용할 기본 인원 제한을 설정합니다.',
      statusTitle: '현재 서버 음성 설정',
      templateLabel: '이름 템플릿',
      limitLabel: '기본 인원 제한',
      setSuccess: '서버의 임시 채널 설정이 업데이트되었습니다.',
      limitValue: '{{limit}}명 (0 = 무제한)',
    },
    language: {
      description: '봇의 언어를 설정합니다.',
      scopeDescription: '본인에게만 또는 서버 전체에 적용',
      localeDescription: '사용할 언어',
      scopeUser: '나만 적용',
      scopeServer: '서버 전체 (관리자 전용)',
      userSet: '개인 언어가 **{{locale}}**(으)로 설정되었습니다.',
      serverSet: '서버 언어가 **{{locale}}**(으)로 설정되었습니다.',
      serverPermissionDenied: '서버 언어 변경은 서버 관리자만 가능합니다.',
    },
    event: {
      description: '서버 이벤트 일정을 관리합니다.',
      createDescription: '새 서버 이벤트를 생성합니다.',
      listDescription: '예정된 서버 이벤트 목록을 조회합니다.',
      cancelDescription: '예약된 서버 이벤트를 취소합니다.',
      announceDescription: '이벤트 공지 Embed를 다시 게시합니다.',
      titleDescription: '이벤트 제목',
      dateDescription: 'YYYY-MM-DD 형식의 날짜',
      timeDescription: 'HH:mm 형식의 시간 (24시간제, Asia/Seoul 기준)',
      descriptionOptionDescription: '선택 사항인 이벤트 설명',
      channelDescription: '선택 사항인 공지 채널',
      reminderDescription: '리마인더 메시지 사용 여부',
      remindersDescription: '분 단위 리마인더 목록, 예: 0,10,60',
      idDescription: '취소할 이벤트 ID',
      createSuccessTitle: '이벤트 생성 완료',
      createSuccessBody: '**{{title}}** 이벤트가 예약되었습니다.',
      listTitle: '예정된 이벤트 목록',
      listEmpty: '예정된 이벤트가 없습니다.',
      listItemValue: '**시작 시각:** {{startsAt}}\n**남은 시간:** {{relative}}\n**상태:** {{status}}\n**리마인더:** {{reminder}}\n**채널:** {{channel}}',
      cancelSuccess: '`{{id}}` 이벤트를 취소했습니다.',
      cancelNotFound: 'ID가 `{{id}}`인 예약 이벤트를 찾지 못했습니다.',
      announceSuccess: '`{{id}}` 이벤트를 {{channel}} 채널에 공지했습니다.',
      announceNotAvailable: '이 이벤트에는 사용할 수 있는 공지 채널이 설정되어 있지 않습니다.',
      startAnnouncementTitle: '이벤트 시작',
      startAnnouncementLead: '이 이벤트가 지금 시작됩니다.',
      invalidDateTime: '이벤트 날짜 또는 시간 형식이 올바르지 않습니다.',
      invalidDateTimeResolution: '날짜는 `YYYY-MM-DD`, 시간은 `HH:mm` 24시간 형식으로 입력해주세요.',
      invalidReminderOffsets: '리마인더 분 입력 형식이 올바르지 않습니다.',
      invalidReminderOffsetsResolution: '`0,10,60`처럼 0 이상의 분을 쉼표로 구분해 입력해주세요. 비워두면 자동 공지는 하지 않습니다.',
      invalidPastDateTime: '과거 시각으로 이벤트를 예약할 수 없습니다.',
      invalidPastDateTimeResolution: '미래 시각을 선택한 뒤 다시 시도해주세요.',
      statusScheduled: '예약됨',
      statusCancelled: '취소됨',
      statusCompleted: '완료됨',
      reminderOn: '사용',
      reminderOff: '사용 안 함',
      reminderNone: '자동 공지 없음',
      announcementChannelNone: '미설정',
      fields: {
        eventId: '이벤트 ID',
        startsAt: '시작 시각',
        reminder: '리마인더',
        announcementChannel: '공지 채널',
        status: '상태',
      },
    },
    autorole: {
      description: '입장 시 역할을 자동으로 부여하는 기능을 설정합니다.',
      statusTitle: '자동 역할 부여 설정 상태',
      userRoleLabel: '일반 유저 역할',
      botRoleLabel: '봇 역할',
      statusLabel: '유저 자동 부여',
      botStatusLabel: '봇 자동 부여',
      userRolePlaceholder: '유저 기본 역할을 선택하세요',
      botRolePlaceholder: '봇 기본 역할을 선택하세요',
      toggleUserEnable: '🟢 유저 자동부여 켜기',
      toggleUserDisable: '🔴 유저 자동부여 끄기',
      toggleBotEnable: '🟢 봇 자동부여 켜기',
      toggleBotDisable: '🔴 봇 자동부여 끄기',
      notSet: '미설정',
      enabled: '활성',
      disabled: '비활성',
      updateSuccess: '자동 역할 설정이 업데이트되었습니다.',
      permissionsError: '봇의 역할 순위가 낮거나 권한이 부족하여 역할을 부여할 수 없습니다.',
      suspendNotice: '권한 부족으로 인해 자동 역할 부여 기능이 일시 중지되었습니다. 봇의 권한과 역할 순위를 확인해 주세요.',
    },
    music: {
      description: 'Play YouTube audio in voice channels.',
      addDescription: 'Search YouTube or add a video URL to the queue.',
      queueDescription: 'Show the current music queue.',
      removeDescription: 'Remove a track from the upcoming queue.',
      pauseDescription: 'Pause the currently playing track.',
      resumeDescription: 'Resume the paused track.',
      skipDescription: 'Skip the currently playing track.',
      stopDescription: 'Stop playback and clear the queue.',
      leaveDescription: 'Disconnect the bot from the voice channel.',
      queryDescription: 'Search query for YouTube',
      urlDescription: 'YouTube video URL',
      indexDescription: 'Queue index to remove',
      addMutuallyExclusive: 'Choose either a search query or a YouTube URL.',
      addMutuallyExclusiveResolution: 'Provide exactly one of `query` or `url`.',
      notInVoice: 'You must be in a voice channel to use music commands.',
      notInVoiceResolution: 'Join a voice channel first, then try again.',
      differentVoiceChannel: 'Music is already being used in another voice channel.',
      differentVoiceChannelResolution: 'Join the same voice channel as the bot or wait until the current session ends.',
      noSearchResults: 'No YouTube results were found for that query.',
      noSearchResultsResolution: 'Try a more specific search phrase or use a direct YouTube URL.',
      invalidUrl: 'The provided YouTube URL is invalid.',
      invalidUrlResolution: 'Use a standard `youtube.com` or `youtu.be` video link.',
      noActiveSession: 'There is no active music session in this server.',
      noActiveSessionResolution: 'Add a track first to start playback.',
      queueAddedNowPlaying: 'Added **{{title}}** and started playback in {{channel}}.',
      queueAddedLater: 'Added **{{title}}** to the queue. Position: `#{{position}}`.',
      playlistAddedNowPlaying: 'Added **{{count}}** tracks from the playlist and started playback in {{channel}}.',
      playlistAddedLater: 'Added **{{count}}** tracks from the playlist to the queue.',
      queueTitle: 'Music Queue',
      queueEmpty: 'The music queue is currently empty.',
      queueNowPlaying: 'Now Playing',
      queueUpcoming: 'Up Next',
      queueMoreItems: '...and **{{count}}** more track(s).',
      queueRemoved: 'Removed **{{title}}** from the queue.',
      queueRemoveOutOfRange: 'That queue index does not exist.',
      queueRemoveOutOfRangeResolution: 'Use `/music queue` to check the current queue indexes first.',
      pauseSuccess: 'Paused the current track.',
      resumeSuccess: 'Resumed playback.',
      skipSuccess: 'Skipped the current track.',
      leaveSuccess: 'Disconnected from the voice channel and cleared the queue.',
      stopSuccess: 'Stopped playback and cleared the queue.',
      playbackStartedTitle: 'Now Playing',
      playbackIdleTitle: 'Queue Finished',
      playbackIdleBody: 'There are no more tracks in the queue.',
      playbackFailed: 'Failed to play **{{title}}**. Skipping to the next track.',
      playbackFailedResolution: 'The stream could not be loaded from YouTube.',
      streamUnavailable: 'Could not load a playable audio stream for this video.',
      streamUnavailableResolution: 'Try another video or add the track again later.',
      requestedBy: 'Requested by',
      duration: 'Duration',
      progress: 'Progress',
      source: 'Source',
      status: 'Status',
      queueLength: 'Queue Length',
      nextTrack: 'Next Track',
      statusPlaying: 'Playing',
      statusPaused: 'Paused',
      unknownDuration: 'Unknown',
      buttons: {
        pause: 'Pause',
        resume: 'Resume',
        skip: 'Skip',
        stop: 'Stop',
        leave: 'Leave',
      },
    },
    fishing: {
      description: '낚시 미니게임을 플레이합니다.',
      enterDescription: '낚시 전용 스레드를 생성하거나 다시 엽니다.',
      castDescription: '자신의 낚시 스레드 안에서 낚시 세션을 시작합니다.',
      endDescription: '낚시 스레드를 종료하고 삭제합니다.',
      statusDescription: '낚시 통계를 확인합니다.',
      dexDescription: '낚시 도감을 확인합니다.',
      rankingDescription: '이 서버의 물고기 크기 랭킹을 확인합니다.',
      disabled: '이 서버에서는 낚시 미니게임이 비활성화되어 있습니다.',
      restrictedChannel: '낚시는 {{channel}} 채널에서만 시작할 수 있습니다.',
      enterTextChannelOnly: '낚시 스레드는 일반 텍스트 채널에서만 열 수 있습니다.',
      enterExistingThread: '이미 {{thread}}에 자신의 낚시 스레드가 열려 있습니다.',
      enterCreated: '{{thread}}에 낚시 스레드를 만들었습니다.',
      castThreadOnly: '/fishing cast는 자신의 낚시 스레드 안에서만 사용할 수 있습니다.',
      startExistingSession: '이미 {{thread}}에서 진행 중인 낚시 세션이 있습니다.',
      startCreated: '{{thread}}에서 낚시 세션을 시작했습니다.',
      noActiveSession: '종료할 낚시 세션이나 스레드가 없습니다.',
      ownerOnly: '이 낚시 세션의 소유자만 조작할 수 있습니다.',
      wrongThread: '이 조작은 자신의 낚시 스레드 안에서만 사용할 수 있습니다.',
      endDeleted: '낚시 스레드를 종료했습니다. 스레드를 삭제합니다.',
      profileTitle: '{{user}}의 낚시 프로필',
      profileEmpty: '아직 낚시 기록이 없습니다.',
      dexTitle: '{{user}}의 낚시 도감',
      dexEmpty: '아직 발견한 물고기가 없습니다.',
      rankingTitle: '낚시 크기 랭킹',
      rankingEmpty: '아직 이 서버에 낚시 기록이 없습니다.',
      titleActive: '낚시 세션',
      titleEnded: '낚시 세션 종료',
      status: '상태',
      rarity: '레어도',
      size: '크기',
      catchCount: '포획 수',
      bestRarity: '최고 레어도',
      bestSize: '최고 크기',
      targetFish: '대상 물고기',
      distance: '거리',
      tension: '끊어짐 게이지',
      reward: '보상',
      successRate: '성공률',
      totalCasts: '총 시도',
      totalGoldEarned: '누적 골드',
      bestCatchReward: '최고 보상',
      rarityBreakdown: '레어도별 포획',
      lastCastAt: '최근 낚시',
      noRecord: '기록 없음',
      threadHint: '/fishing cast로 다시 시작하거나 /fishing end로 스레드를 삭제할 수 있습니다.',
      catchResultTitle: '낚시 성공!',
      catchResultBody: '**{{rarity}} {{fish}}**를 낚았습니다. 크기는 **{{sizeCm}} cm**, 보상은 **{{reward}} G**입니다.',
      states: {
        hooked: '입질 중',
        resting: '휴식 중',
        tense: '당기는 중',
        missed: '타이밍 빗나감',
        success: '낚시 성공',
        failed: '줄이 끊어짐',
      },
    },
    permissionAudit: {
      title: '봇 권한 진단 보고서',
      channel: '채널',
      noResults: '진단할 기능이 없습니다. 봇이 아직 설정되지 않았을 수 있습니다.',
      summaryLabel: '진단 결과 요약',
      summaryOk: '✅ 모든 항목 정상. 문제가 없습니다.',
      summaryIssue: '❌ {{fail}}개 실패 · ⚠️ {{warn}}개 경고 감지됨.',
      hierarchyWarning: "봇 역할(순위: {{botPos}})이 '{{role}}'(순위: {{targetPos}})보다 위에 있어야 관리할 수 있습니다.",
      features: {
        BASIC: '기본 봇 기능',
        VOICE_GLOBAL: '임시 음성 채널 (전역)',
        VOICE_GENERATOR_CHANNEL: '음성 생성기 채널',
        VOICE_GENERATOR_CATEGORY: '음성 생성기 카테고리',
        MIMIC_WEBHOOK: '메시지 흉내 (Webhook)',
      },
    },
    setup: {
      description: '설정 마법사를 실행하여 봇의 필수 기능들을 단계별로 설정합니다.',
      step0: { 
        title: '✨ 봇 설정 마법사 시작', 
        desc: '환영합니다! 이 마법사를 통해 아래 4가지 항목을 설정합니다.\n\n1️⃣ **언어 설정**\n2️⃣ **필수 권한 점검**\n3️⃣ **감사 채널 설정**\n4️⃣ **임시 음성 채널 설정**', 
        startBtn: '설정 시작하기' 
      },
      step1: { 
        title: '1️⃣ 언어 설정', 
        desc: '서버 전체에 적용될 봇의 기본 언어를 선택하세요. (현재: **{{locale}}**)', 
        placeholder: '언어를 선택하세요', 
        nextBtn: '다음 단계', 
        skipBtn: '건너뛰기' 
      },
      step2: { 
        title: '2️⃣ 필수 권한 점검', 
        descOk: '✅ **모든 필수 권한이 정상적으로 부여되어 있습니다.**', 
        descFail: '⚠️ **일부 권한이 부족합니다.**\n결과를 확인하고 봇 역할에 필요한 기능 권한을 부여해주세요.', 
        recheckBtn: '다시 검사하기', 
        nextBtn: '다음 단계' 
      },
      step3: { 
        title: '3️⃣ 감사 채널 설정', 
        desc: '봇의 주요 이벤트와 에러 통보를 받을 채널을 선택해주세요.', 
        placeholder: '감사 통보 채널 선택', 
        disableBtn: '감사 채널 끄기/해제', 
        nextBtn: '다음 단계' 
      },
      step4: {
        title: '감사 로그 카테고리 설정',
        desc: '로그를 수신할 카테고리를 선택해주세요.',
        nextBtn: '다음 단계',
      },
      step5: { 
        title: '4️⃣ 임시 음성 채널 설정', 
        desc: '임시 음성 채널을 생성할 "생성기 채널"을 선택해주세요.\n기존의 채널을 고르거나 카테고리/채널을 봇이 **자동 생성**하게 할 수도 있습니다.', 
        placeholder: '생성기로 쓸 음성 채널 선택', 
        autoBtn: '🚀 자동 생성하기', 
        skipBtn: '임시 음성 사용 안함', 
        nextBtn: '설정 완료' 
      },
      step6: { 
        title: '🎉 설정 완료 요약', 
        desc: '**1. 언어**: {{lang}}\n**2. 감사 채널**: {{audit}}\n**3. 감사 카테고리**: {{categories}}\n**4. 임시 음성 채널**: {{voice}}', 
        finishBtn: '마치기' 
      },
      finished: '✅ 설정 마법사를 종료했습니다.',
      expired: '⏳ 시간이 만료되었습니다. `/setup`을 다시 실행해주세요.',
      defaultCategoryName: '음성 채널',
      defaultGeneratorName: '➕ 채널 생성하기',
      auditCategories: {
        SYSTEM: '시스템',
        BOOT: '부팅',
        VOICE: '음성',
        PERMISSION: '권한',
      },
    },
    config: {
      title: '기능 설정 변경 결과',
      noOptions: '변경할 옵션을 하나 이상 선택해주세요.',
      mimic: {
        label: '미믹(Mimic)',
        enabled: '활성',
        disabled: '비활성',
      },
      emoji: {
        label: '이모지 확대(Big Emoji)',
        enabled: '활성',
        disabled: '비활성',
      },
    },
  },

  // ── 모달 ────────────────────────────────────────────────
  modals: {
    renameTitle: '음성 채널 이름 변경',
    renameLabel: '새 채널 이름',
    limitTitle: '인원 제한 설정',
    limitLabel: '인원 제한 (0 = 무제한, 1-99)',
  },

  // ── 셀렉트 메뉴 플레이스홀더 ────────────────────────────
  selects: {
    kickUser: '추방할 유저를 선택하세요',
    banUser: '차단할 유저를 선택하세요',
    transferOwner: '소유권을 이전할 유저를 선택하세요',
  },

  // ── 상태 메시지 ──────────────────────────────────────────
  presence: {
    servers: '{{guildCount}}개의 서버에서 작동 중',
    help: '/help 명령어를 확인하세요',
    managing: '임시 음성 채널 관리 중',
    version: 'Kord v1.0.0',
  },
};
