/**
 * 주일 기업 - 현장설명회 관리 타입 정의
 */

import { getTodayString } from '@/lib/utils/date';

// 현장설명회 상태
export type SiteBriefingStatus = 'scheduled' | 'ongoing' | 'completed' | 'cancelled' | 'postponed';

// 입찰 상태
export type BidStatus = 'pending' | 'bidding' | 'closed' | 'failed' | 'awarded';

// 참석자 타입 (외부 참석자 - 상세 정보)
export interface Attendee {
  id: string;
  name: string;
  company: string;
  phone: string;
  email: string;
  isAttended: boolean;
}

// 참석자 항목 타입 (내부 직원 또는 직접 입력)
export interface AttendeeItem {
  id: string;   // 직원 ID (직접 입력 시 빈 문자열)
  name: string; // 이름
}

// 현장설명회 타입
export interface SiteBriefing {
  id: string;
  briefingCode: string; // 현장설명회 코드

  // 기본 정보
  title: string; // 현장설명회명
  description: string; // 설명
  partnerId: string; // 거래처 ID
  partnerName: string; // 거래처명

  // 일정 정보
  briefingDate: string; // 현장설명회 날짜
  briefingTime: string; // 현장설명회 시간
  location: string; // 장소
  address: string; // 주소

  // 상태 정보
  status: SiteBriefingStatus; // 현장설명회 상태
  bidStatus: BidStatus; // 입찰 상태
  bidDate: string | null; // 입찰 날짜

  // 참석자 정보
  attendee: string; // 참석자
  attendees: Attendee[];
  attendeeCount: number; // 참석자 수
  attendanceStatus: AttendanceStatus; // 참석 상태

  // 메타 정보
  createdAt: string;
  updatedAt: string;
  createdBy: string;
}

// 현장설명회 통계
export interface SiteBriefingStats {
  total: number; // 전체
  scheduled: number; // 예정
  ongoing: number; // 진행중
  completed: number; // 완료
  cancelled: number; // 취소
}

// 현장설명회 필터
export interface SiteBriefingFilter {
  search?: string;
  status?: SiteBriefingStatus | 'all';
  bidStatus?: BidStatus | 'all';
  partnerId?: string;
  startDate?: string;
  endDate?: string;
  sortBy?: 'latest' | 'oldest' | 'dateAsc' | 'dateDesc';
  page?: number;
  size?: number;
}

// API 응답 타입
export interface SiteBriefingListResponse {
  items: SiteBriefing[];
  total: number;
  page: number;
  size: number;
  totalPages: number;
}

// 상태 옵션
export const SITE_BRIEFING_STATUS_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'scheduled', label: '입찰예정' },
  { value: 'ongoing', label: '입찰' },
  { value: 'completed', label: '마감' },
  { value: 'cancelled', label: '유찰' },
  { value: 'postponed', label: '현장설명회 유찰' },
];

export const BID_STATUS_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'pending', label: '대기' },
  { value: 'bidding', label: '입찰중' },
  { value: 'closed', label: '마감' },
  { value: 'failed', label: '유찰' },
  { value: 'awarded', label: '낙찰' },
];

// 상태별 배지 색상
export const STATUS_BADGE_COLORS: Record<SiteBriefingStatus, string> = {
  scheduled: 'bg-blue-100 text-blue-800',
  ongoing: 'bg-orange-100 text-orange-800',
  completed: 'bg-green-100 text-green-800',
  cancelled: 'bg-red-100 text-red-800',
  postponed: 'bg-gray-100 text-gray-800',
};

export const BID_STATUS_BADGE_COLORS: Record<BidStatus, string> = {
  pending: 'bg-gray-100 text-gray-800',
  bidding: 'bg-blue-100 text-blue-800',
  closed: 'bg-green-100 text-green-800',
  failed: 'bg-red-100 text-red-800',
  awarded: 'bg-purple-100 text-purple-800',
};

// 상태 한글 라벨
export const STATUS_LABELS: Record<SiteBriefingStatus, string> = {
  scheduled: '입찰예정',
  ongoing: '입찰',
  completed: '마감',
  cancelled: '유찰',
  postponed: '현장설명회 유찰',
};

export const BID_STATUS_LABELS: Record<BidStatus, string> = {
  pending: '대기',
  bidding: '입찰중',
  closed: '마감',
  failed: '유찰',
  awarded: '낙찰',
};

// ============================================
// 폼 관련 타입 및 옵션
// ============================================

// 구분 (온라인/오프라인)
export type BriefingType = 'online' | 'offline';

// 참석 상태
export type AttendanceStatus = 'scheduled' | 'attended' | 'absent';

// 부가세 타입
export type VatType = 'excluded' | 'included';

// 참여업체 메모
export interface ParticipatingCompany {
  id: string;
  companyName: string;
  memo: string;
}

// 현장설명회 자료 (파일)
export interface BriefingDocument {
  id: string;
  fileName: string;
  fileUrl: string;
  fileSize: number;
  uploadedAt: string;
}

// 폼 데이터 타입
export interface SiteBriefingFormData {
  // 기본 정보
  briefingCode: string; // 현설번호
  partnerId: string; // 거래처 ID
  partnerName: string; // 거래처명
  briefingDate: string; // 현장설명회 일자
  briefingTime: string; // 현장설명회 시간
  briefingType: BriefingType; // 구분 (온라인/오프라인)
  location: string; // 현장설명회 장소
  attendeeItems: AttendeeItem[]; // 참석자 목록 (JSON으로 저장)
  attendanceStatus: AttendanceStatus; // 상태

  // 입찰 정보
  projectName: string; // 현장명
  bidDate: string; // 입찰일자
  siteCount: number; // 개소
  constructionStartDate: string; // 공사기간 시작
  constructionEndDate: string; // 공사기간 종료
  vatType: VatType; // 부가세
  workReport: string; // 업무 보고
  documents: BriefingDocument[]; // 현장설명회 자료

  // 참여업체 및 메모
  participatingCompanies: ParticipatingCompany[];
}

// 구분 옵션
export const BRIEFING_TYPE_OPTIONS = [
  { value: 'online', label: '온라인' },
  { value: 'offline', label: '오프라인' },
];

// 참석 상태 옵션
export const ATTENDANCE_STATUS_OPTIONS = [
  { value: 'scheduled', label: '참석예정' },
  { value: 'attended', label: '참석완료' },
  { value: 'absent', label: '불참' },
];

// 부가세 옵션
export const VAT_TYPE_OPTIONS = [
  { value: 'excluded', label: '부가세 별도' },
  { value: 'included', label: '부가세 포함' },
];

// 오늘 날짜 (YYYY-MM-DD)
const getTodayDate = () => getTodayString();

// 날짜 값 정규화 (빈 값, '0', null이면 오늘 날짜 반환)
const normalizeDateValue = (value: string | null | undefined): string => {
  if (!value || value === '0' || value === 'null' || value === '0000-00-00') {
    return getTodayDate();
  }
  return value;
};

// 빈 폼 데이터 생성
export function getEmptySiteBriefingFormData(): SiteBriefingFormData {
  const today = getTodayDate();
  return {
    briefingCode: '',
    partnerId: '',
    partnerName: '',
    briefingDate: today,
    briefingTime: '',
    briefingType: 'offline',
    location: '',
    attendeeItems: [],
    attendanceStatus: 'scheduled',
    projectName: '',
    bidDate: today,
    siteCount: 0,
    constructionStartDate: '',
    constructionEndDate: '',
    vatType: 'excluded',
    workReport: '',
    documents: [],
    participatingCompanies: [],
  };
}

// attendee JSON 문자열을 AttendeeItem[]로 파싱
export function parseAttendeeItems(attendeeJson: string | null): AttendeeItem[] {
  if (!attendeeJson) return [];
  try {
    const parsed = JSON.parse(attendeeJson);
    if (Array.isArray(parsed)) {
      return parsed.filter((item): item is AttendeeItem =>
        typeof item === 'object' && item !== null && typeof item.name === 'string'
      );
    }
    return [];
  } catch {
    // JSON 파싱 실패 시 기존 단일 문자열을 AttendeeItem으로 변환
    if (attendeeJson.trim()) {
      return [{ id: '', name: attendeeJson.trim() }];
    }
    return [];
  }
}

// SiteBriefing을 FormData로 변환
export function siteBriefingToFormData(briefing: SiteBriefing): SiteBriefingFormData {
  return {
    briefingCode: briefing.briefingCode,
    partnerId: briefing.partnerId,
    partnerName: briefing.partnerName,
    briefingDate: normalizeDateValue(briefing.briefingDate),
    briefingTime: briefing.briefingTime,
    briefingType: 'offline', // 기본값
    location: briefing.location,
    attendeeItems: parseAttendeeItems(briefing.attendee),
    attendanceStatus: briefing.attendanceStatus || 'scheduled',
    projectName: briefing.title,
    bidDate: normalizeDateValue(briefing.bidDate),
    siteCount: 0, // 기본값
    constructionStartDate: '',
    constructionEndDate: '',
    vatType: 'excluded',
    workReport: briefing.description,
    documents: [],
    participatingCompanies: [],
  };
}
