/**
 * 직원관리 유틸리티 함수
 *
 * API 데이터 ↔ Frontend 데이터 변환
 */

import type {
  Employee,
  EmployeeFormData,
  EmployeeStatus,
  EmploymentType,
  Gender,
  DepartmentPosition,
  BankAccount,
  Address,
  UserInfo,
  UserRole,
} from './types';

// ============================================
// 프로필 이미지 URL 변환
// ============================================

const API_URL = process.env.NEXT_PUBLIC_API_URL || '';

/**
 * 프로필 이미지 경로를 전체 URL로 변환
 * - 이미 전체 URL이면 그대로 반환
 * - base64 data URL이면 그대로 반환
 * - /api/proxy/files/ 경로면 그대로 반환
 * - 상대 경로면 그대로 반환 (R2 전환 후 직접 접근 불가)
 */
export function getProfileImageUrl(path: string | null | undefined): string | undefined {
  if (!path) return undefined;

  // base64 data URL인 경우 (미리보기)
  if (path.startsWith('data:')) {
    return path;
  }

  // 이미 전체 URL인 경우
  if (path.startsWith('http://') || path.startsWith('https://')) {
    return path;
  }

  // 프록시 경로인 경우 (/api/proxy/files/{id}/view)
  if (path.startsWith('/api/proxy/')) {
    return path;
  }

  // 상대 경로인 경우 — R2 전환 후 /storage/tenants/ 직접 접근 불가
  // 경로만 보존하고 표시는 프록시 통해서 처리
  return path;
}

/**
 * 전체 URL에서 상대 경로 추출 (API 저장용)
 * - 상대 경로면 그대로 반환
 * - 전체 URL이면 상대 경로 추출
 * - base64 data URL이면 빈 문자열 반환 (저장하지 않음)
 */
export function extractRelativePath(path: string | null | undefined): string | null {
  if (!path) return null;

  // base64 data URL인 경우 (미리보기) - 저장하지 않음
  if (path.startsWith('data:')) {
    return null;
  }

  // blob URL인 경우 (미리보기) - 저장하지 않음
  if (path.startsWith('blob:')) {
    return null;
  }

  // 프록시 경로인 경우 (/api/proxy/files/{id}/view) - 그대로 반환
  if (path.startsWith('/api/proxy/')) {
    return path;
  }

  // 전체 URL인 경우 상대 경로 추출
  if (path.startsWith('http://') || path.startsWith('https://')) {
    // /storage/tenants/ 이후의 경로 추출 (레거시)
    const match = path.match(/\/storage\/tenants\/(.+)$/);
    if (match) {
      return match[1];
    }
    // /api/proxy/files/ 경로 추출
    const proxyMatch = path.match(/(\/api\/proxy\/files\/.+)$/);
    if (proxyMatch) {
      return proxyMatch[1];
    }
    // 매칭 실패 시 null 반환
    return null;
  }

  // 이미 상대 경로인 경우 그대로 반환
  return path;
}

// ============================================
// API 응답 타입 (TenantUserProfile)
// ============================================

export interface EmployeeApiData {
  id: number;
  tenant_id: number;
  user_id: number;
  department_id: number | null;
  position_key: string | null;
  job_title_key: string | null;
  position_label: string | null;    // 직급 한글명 (positions 테이블에서 조회)
  job_title_label: string | null;   // 직책 한글명 (positions 테이블에서 조회)
  work_location_key: string | null;
  employment_type_key: string | null;
  employee_status: string;
  manager_user_id: number | null;
  profile_photo_path: string | null;
  display_name: string | null;
  json_extra: {
    employee_code?: string;
    resident_number?: string;
    gender?: string;
    address?: {
      zip_code?: string;
      address1?: string;
      address2?: string;
    };
    salary?: number;
    hire_date?: string;
    rank?: string;
    bank_account?: {
      bank_name?: string;
      account_number?: string;
      account_holder?: string;
    };
    work_type?: string;
    contract_info?: unknown;
    resignation_date?: string;
    resignation_reason?: string;
    clock_in_location?: string;
    clock_out_location?: string;
  } | null;
  created_at: string;
  updated_at: string;
  // Relations
  user?: {
    id: number;
    user_id: string;
    name: string;
    email: string;
    phone: string | null;
    has_account: boolean;
    is_active: boolean;
  };
  department?: {
    id: number;
    name: string;
    code: string | null;
  };
  manager?: {
    id: number;
    display_name: string | null;
    user?: {
      name: string;
    };
  };
}

// ============================================
// 변환 함수: API → Frontend
// ============================================

/**
 * API 응답을 Frontend 형식으로 변환
 */
export function transformApiToFrontend(api: EmployeeApiData): Employee {
  const extra = api.json_extra || {};

  // 부서/직책 정보 구성
  const departmentPositions: DepartmentPosition[] = [];
  if (api.department_id && api.department) {
    departmentPositions.push({
      id: String(api.id),
      departmentId: String(api.department_id),
      departmentName: api.department.name,
      positionId: api.job_title_key || '',
      positionName: api.job_title_label || api.job_title_key || '', // 직책 한글명 사용
    });
  }

  // 은행 계좌 정보
  const bankAccount: BankAccount | undefined = extra.bank_account
    ? {
        bankName: extra.bank_account.bank_name || '',
        accountNumber: extra.bank_account.account_number || '',
        accountHolder: extra.bank_account.account_holder || '',
      }
    : undefined;

  // 주소 정보
  const address: Address | undefined = extra.address
    ? {
        zipCode: extra.address.zip_code || '',
        address1: extra.address.address1 || '',
        address2: extra.address.address2 || '',
      }
    : undefined;

  // 사용자 정보 (시스템 계정)
  const userInfo: UserInfo | undefined = api.user?.has_account
    ? {
        userId: api.user.user_id,
        role: 'user' as UserRole, // 기본값, API에서 실제 역할 정보 필요
        accountStatus: api.user.is_active ? 'active' : 'inactive',
      }
    : undefined;

  return {
    id: String(api.id),
    userId: api.user_id, // users 테이블 ID
    name: api.user?.name || api.display_name || '',
    employeeCode: extra.employee_code,
    residentNumber: extra.resident_number,
    phone: api.user?.phone || undefined,
    email: api.user?.email || undefined,
    salary: extra.salary,
    bankAccount,
    profileImage: getProfileImageUrl(api.profile_photo_path),
    gender: extra.gender as Gender | undefined,
    address,
    hireDate: extra.hire_date,
    employmentType: mapEmploymentType(api.employment_type_key || extra.work_type),
    rank: api.position_label || extra.rank, // 직급 한글명 사용 (position_label 우선)
    status: mapEmployeeStatus(api.employee_status),
    departmentPositions,
    clockInLocation: extra.clock_in_location,
    clockOutLocation: extra.clock_out_location,
    resignationDate: extra.resignation_date,
    resignationReason: extra.resignation_reason,
    userInfo,
    createdAt: api.created_at,
    updatedAt: api.updated_at,
  };
}

// ============================================
// 변환 함수: Frontend → API
// ============================================

/**
 * Frontend 폼 데이터를 API 형식으로 변환
 */
export function transformFrontendToApi(form: EmployeeFormData): Record<string, unknown> {
  return {
    // 기본 사용자 정보
    name: form.name,
    email: form.email,
    phone: form.phone || null,
    user_id: form.userId || null,
    password: form.password || null,
    is_active: form.accountStatus === 'active',

    // 테넌트 프로필 정보
    department_id: form.departmentPositions[0]?.departmentId
      ? parseInt(form.departmentPositions[0].departmentId, 10)
      : null,
    position_key: form.departmentPositions[0]?.positionId || null,
    job_title_key: form.departmentPositions[0]?.positionName || null,
    employment_type_key: form.employmentType || null,
    employee_status: form.status,
    display_name: form.name,
    profile_photo_path: extractRelativePath(form.profileImage),

    // 추가 정보 (json_extra)
    employee_code: form.employeeCode || null,
    resident_number: form.residentNumber || null,
    gender: form.gender || null,
    address: form.address?.address1 ? {
      zip_code: form.address.zipCode,
      address1: form.address.address1,
      address2: form.address.address2,
    } : null,
    salary: form.salary ? parseInt(form.salary, 10) : null,
    hire_date: form.hireDate || null,
    rank: form.rank || null,
    bank_account: form.bankAccount?.bankName ? {
      bank_name: form.bankAccount.bankName,
      account_number: form.bankAccount.accountNumber,
      account_holder: form.bankAccount.accountHolder,
    } : null,
    work_type: form.employmentType || 'regular',
    resignation_date: form.resignationDate || null,
    resignation_reason: form.resignationReason || null,
    clock_in_location: form.clockInLocation || null,
    clock_out_location: form.clockOutLocation || null,
  };
}

// ============================================
// 매핑 헬퍼 함수
// ============================================

/**
 * API 고용 상태를 Frontend 상태로 매핑
 */
function mapEmployeeStatus(status: string | null): EmployeeStatus {
  switch (status?.toLowerCase()) {
    case 'active':
    case 'employed':
      return 'active';
    case 'leave':
    case 'on_leave':
      return 'leave';
    case 'resigned':
    case 'terminated':
      return 'resigned';
    default:
      return 'active';
  }
}

/**
 * API 고용 형태를 Frontend 형태로 매핑
 */
function mapEmploymentType(type: string | null | undefined): EmploymentType | undefined {
  if (!type) return undefined;
  switch (type.toLowerCase()) {
    case 'regular':
    case 'full_time':
    case 'fulltime':
      return 'regular';
    case 'contract':
    case 'temporary':
      return 'contract';
    case 'parttime':
    case 'part_time':
      return 'parttime';
    case 'intern':
    case 'internship':
      return 'intern';
    default:
      return undefined;
  }
}