/**
 * ========================================
 * 인증(Auth) 관련 타입 정의
 * ========================================
 *
 * @description
 * - 백엔드 UserModel Entity 및 Auth DTOs와 1:1 매핑
 * - 회원가입, 로그인, 프로필 관리 포함
 */

// ========================================
// 1. 사용자 기본 정보
// ========================================

/**
 * 사용자 정보
 *
 * @backend UserModel Entity
 * @description 시스템 사용자 기본 정보
 * @usage
 * - 로그인 후 세션 정보
 * - 사용자 프로필 조회
 */
export interface UserDto {
  // === 기본 키 ===
  pkUserNo: number                 // 사용자 내부 번호 (Primary Key, 자동증가)
  userId: string                   // 로그인 ID (아이디)

  // === 사용자 정보 ===
  userName: string                 // 이름
  userPhone?: string               // 핸드폰 번호
  userEmail?: string               // 이메일 (인증용)

  // === 권한 ===
  userRole: 'USER' | 'ADMIN'       // 권한 (USER: 일반 사용자, ADMIN: 관리자)

  // === 시스템 필드 ===
  delDt?: string                   // 삭제일시 (Soft Delete)
}

// ========================================
// 2. 회원가입 관련 타입
// ========================================

/**
 * 회원가입 요청
 *
 * @backend SignupDto
 * @description 신규 사용자 등록 정보
 * @usage POST /auth/signup 요청 바디
 */
export interface SignupDto {
  // === 사용자 구분 ===
  userSe: 'FARM' | 'CNSLT' | 'ORGAN'  // 구분 (농가/컨설턴트/기관)
  userInstName?: string            // 농장명 또는 기관명

  // === 계정 정보 ===
  userId: string                   // 사용자 ID (4자 이상)
  userPassword: string             // 비밀번호 (6자 이상)

  // === 개인 정보 ===
  userName: string                 // 이름
  userPhone: string                // 휴대폰 번호
  userEmail: string                // 이메일
  userBirth?: string               // 생년월일
  userAddress?: string             // 주소

  // === 사업자 정보 ===
  userBizNo?: string               // 사업자등록번호
}

/**
 * 회원가입 폼 데이터
 *
 * @description
 * - 클라이언트 전용 (백엔드 전송 전 변환 필요)
 * - 이메일 분리 입력 등 UI 편의 필드 포함
 *
 * @usage 회원가입 페이지 폼
 */
export interface SignupFormData {
  userSe: string                   // 사용자 구분
  userId: string                   // 사용자 ID
  userPassword: string             // 비밀번호
  confirmPassword: string          // 비밀번호 확인
  userName: string                 // 이름
  userPhone: string                // 휴대폰 번호
  userEmail: string                // 이메일 전체
  emailId: string                  // 이메일 ID 부분
  emailDomain: string              // 이메일 도메인 부분
  customDomain?: string            // 직접 입력 도메인
  userInstName?: string            // 농장명/기관명
  userBirth?: string               // 생년월일
  userAddress?: string             // 주소
  userBizNo?: string               // 사업자등록번호
}

// ========================================
// 3. 로그인 관련 타입
// ========================================

/**
 * 로그인 요청
 *
 * @backend LoginDto
 * @description 로그인 인증 정보
 * @usage POST /auth/login 요청 바디
 */
export interface LoginDto {
  userId: string                   // 사용자 ID
  userPassword: string             // 비밀번호
}

/**
 * 인증 응답 (통합)
 *
 * @description
 * - 로그인/회원가입 공통 응답 형식
 * - 프론트엔드에서 확장하여 사용
 */
export interface AuthResponseDto {
  message?: string                 // 결과 메시지
  accessToken: string              // JWT 액세스 토큰
  user: UserDto                    // 사용자 정보
  defaultAnalysisYear: number      // 최근 검사 년도
}

// ========================================
// 4. 프로필 관련 타입
// ========================================

/**
 * 사용자 프로필
 *
 * @description
 * - UserDto를 확장하여 통계 정보 추가
 * - 프론트엔드에서 확장
 *
 * @usage 마이페이지 프로필 표시
 */
export interface UserProfileDto extends UserDto {
  farmCount?: number               // 보유 농장 수
  cowCount?: number                // 보유 개체 수
}
