'use server';

import type {
  Issue,
  IssueStats,
  IssueFilter,
  IssueListResponse,
} from './types';

/**
 * 이슈관리 Server Actions
 */

// Mock 이슈 데이터
const mockIssues: Issue[] = [
  {
    id: '1',
    issueNumber: 'ISS-2025-001',
    constructionNumber: 'CON-001',
    partnerName: '대한건설',
    siteName: '서울 강남 현장',
    constructionPM: '홍길동',
    constructionManagers: '홍길동, 김철수, 이영희',
    category: 'material',
    title: '자재 품질 불량',
    content: '납품된 철근 일부에 녹이 발생하여 품질 검수가 필요합니다.',
    reporter: '홍길동',
    reportDate: '2025-09-01',
    resolvedDate: '2025-09-03',
    assignee: '김과장',
    priority: 'urgent',
    status: 'resolved',
    description: '납품된 철근 일부에 녹이 발생',
    createdAt: '2025-09-01T09:00:00Z',
    updatedAt: '2025-09-03T15:00:00Z',
  },
  {
    id: '2',
    issueNumber: 'ISS-2025-002',
    constructionNumber: 'CON-002',
    partnerName: '삼성시공',
    siteName: '부산 해운대 현장',
    constructionPM: '김철수',
    constructionManagers: '김철수, 박민수',
    category: 'safety',
    title: '안전장비 미착용',
    content: '현장 작업자 안전모 미착용 발견되어 시정 조치가 필요합니다.',
    reporter: '김철수',
    reportDate: '2025-09-02',
    resolvedDate: null,
    assignee: '이부장',
    priority: 'urgent',
    status: 'in_progress',
    description: '현장 작업자 안전모 미착용 발견',
    createdAt: '2025-09-02T10:00:00Z',
    updatedAt: '2025-09-02T10:00:00Z',
  },
  {
    id: '3',
    issueNumber: 'ISS-2025-003',
    constructionNumber: 'CON-001',
    partnerName: '대한건설',
    siteName: '서울 강남 현장',
    constructionPM: '홍길동',
    constructionManagers: '홍길동, 김철수, 이영희',
    category: 'process',
    title: '공정 지연',
    content: '우천으로 인한 외부 공사가 지연되고 있습니다.',
    reporter: '이영희',
    reportDate: '2025-09-03',
    resolvedDate: null,
    assignee: '박대리',
    priority: 'normal',
    status: 'received',
    description: '우천으로 인한 외부 공사 지연',
    createdAt: '2025-09-03T08:00:00Z',
    updatedAt: '2025-09-03T08:00:00Z',
  },
  {
    id: '4',
    issueNumber: 'ISS-2025-004',
    constructionNumber: 'CON-003',
    partnerName: 'LG건설',
    siteName: '대전 유성 현장',
    constructionPM: '이영희',
    constructionManagers: '이영희, 최대리',
    category: 'etc',
    title: '예산 초과 우려',
    content: '자재비 상승으로 인한 예산 초과가 예상됩니다.',
    reporter: '박민수',
    reportDate: '2025-09-01',
    resolvedDate: null,
    assignee: '정차장',
    priority: 'normal',
    status: 'unresolved',
    description: '자재비 상승으로 인한 예산 초과 예상',
    createdAt: '2025-09-01T11:00:00Z',
    updatedAt: '2025-09-01T11:00:00Z',
  },
  {
    id: '5',
    issueNumber: 'ISS-2025-005',
    constructionNumber: 'CON-004',
    partnerName: '현대건설',
    siteName: '인천 송도 현장',
    constructionPM: '박민수',
    constructionManagers: '박민수, 홍길동',
    category: 'etc',
    title: '민원 발생',
    content: '인근 주민으로부터 소음 민원이 접수되었습니다.',
    reporter: '최대리',
    reportDate: '2025-09-02',
    resolvedDate: '2025-09-02',
    assignee: '송이사',
    priority: 'normal',
    status: 'resolved',
    description: '소음 민원 접수',
    createdAt: '2025-09-02T14:00:00Z',
    updatedAt: '2025-09-02T18:00:00Z',
  },
  {
    id: '6',
    issueNumber: 'ISS-2025-006',
    constructionNumber: 'CON-002',
    partnerName: '삼성시공',
    siteName: '부산 해운대 현장',
    constructionPM: '김철수',
    constructionManagers: '김철수, 박민수',
    category: 'material',
    title: '시공 품질 미달',
    content: '콘크리트 타설 품질이 기준에 미달합니다.',
    reporter: '홍길동',
    reportDate: '2025-09-03',
    resolvedDate: null,
    assignee: '김과장',
    priority: 'urgent',
    status: 'received',
    description: '콘크리트 타설 품질 기준 미달',
    createdAt: '2025-09-03T09:30:00Z',
    updatedAt: '2025-09-03T09:30:00Z',
  },
  {
    id: '7',
    issueNumber: 'ISS-2025-007',
    constructionNumber: 'CON-005',
    partnerName: 'SK건설',
    siteName: '광주 북구 현장',
    constructionPM: '최대리',
    constructionManagers: '최대리, 김철수, 이영희',
    category: 'safety',
    title: '장비 점검 필요',
    content: '크레인 정기 점검 시기가 도래하여 점검이 필요합니다.',
    reporter: '김철수',
    reportDate: '2025-09-01',
    resolvedDate: null,
    assignee: '이부장',
    priority: 'normal',
    status: 'in_progress',
    description: '크레인 정기 점검 시기 도래',
    createdAt: '2025-09-01T13:00:00Z',
    updatedAt: '2025-09-02T10:00:00Z',
  },
  {
    id: '8',
    issueNumber: 'ISS-2025-008',
    constructionNumber: 'CON-001',
    partnerName: '대한건설',
    siteName: '서울 강남 현장',
    constructionPM: '홍길동',
    constructionManagers: '홍길동, 김철수, 이영희',
    category: 'process',
    title: '인력 부족',
    content: '숙련공 부족으로 공사 진행에 어려움이 있습니다.',
    reporter: '이영희',
    reportDate: '2025-09-02',
    resolvedDate: null,
    assignee: '박대리',
    priority: 'urgent',
    status: 'in_progress',
    description: '숙련공 부족으로 공사 진행 어려움',
    createdAt: '2025-09-02T08:30:00Z',
    updatedAt: '2025-09-03T09:00:00Z',
  },
  // 추가 더미 데이터
  ...Array.from({ length: 47 }, (_, i) => ({
    id: `${i + 9}`,
    issueNumber: `ISS-2025-${String(i + 9).padStart(3, '0')}`,
    constructionNumber: `CON-${String((i % 5) + 1).padStart(3, '0')}`,
    partnerName: ['대한건설', '삼성시공', 'LG건설', '현대건설', 'SK건설'][i % 5],
    siteName: ['서울 강남 현장', '부산 해운대 현장', '대전 유성 현장', '인천 송도 현장', '광주 북구 현장'][i % 5],
    constructionPM: ['홍길동', '김철수', '이영희', '박민수', '최대리'][i % 5],
    constructionManagers: ['홍길동, 김철수', '김철수, 박민수', '이영희, 최대리', '박민수, 홍길동', '최대리, 김철수'][i % 5],
    category: (['material', 'drawing', 'process', 'safety', 'etc'] as const)[i % 5],
    title: `이슈 ${i + 9}`,
    content: `이슈 ${i + 9}에 대한 상세 내용입니다.`,
    reporter: ['홍길동', '김철수', '이영희', '박민수', '최대리'][i % 5],
    reportDate: `2025-09-${String((i % 28) + 1).padStart(2, '0')}`,
    resolvedDate: i % 3 === 0 ? `2025-09-${String(Math.min((i % 28) + 3, 30)).padStart(2, '0')}` : null,
    assignee: ['김과장', '이부장', '박대리', '정차장', '송이사'][i % 5],
    priority: (['urgent', 'normal'] as const)[i % 2],
    status: (['received', 'in_progress', 'resolved', 'unresolved'] as const)[i % 4],
    description: `이슈 설명 ${i + 9}`,
    createdAt: `2025-09-${String((i % 28) + 1).padStart(2, '0')}T09:00:00Z`,
    updatedAt: `2025-09-${String((i % 28) + 1).padStart(2, '0')}T09:00:00Z`,
  })),
];

// 이슈 목록 조회
export async function getIssueList(
  filter?: IssueFilter
): Promise<{ success: boolean; data?: IssueListResponse; error?: string }> {
  try {
    let filtered = [...mockIssues];

    // 거래처 필터 (다중선택)
    if (filter?.partners && filter.partners.length > 0) {
      filtered = filtered.filter((issue) =>
        filter.partners!.some((p) => issue.partnerName.includes(p) || p.includes(issue.partnerName))
      );
    }

    // 현장 필터 (다중선택)
    if (filter?.sites && filter.sites.length > 0) {
      filtered = filtered.filter((issue) =>
        filter.sites!.some((s) => issue.siteName.includes(s) || s.includes(issue.siteName))
      );
    }

    // 구분 필터 (다중선택)
    if (filter?.categories && filter.categories.length > 0) {
      filtered = filtered.filter((issue) =>
        filter.categories!.includes(issue.category)
      );
    }

    // 보고자 필터 (다중선택)
    if (filter?.reporters && filter.reporters.length > 0) {
      filtered = filtered.filter((issue) =>
        filter.reporters!.some((r) => issue.reporter.includes(r) || r.includes(issue.reporter))
      );
    }

    // 담당자 필터 (다중선택)
    if (filter?.assignees && filter.assignees.length > 0) {
      filtered = filtered.filter((issue) =>
        filter.assignees!.some((a) => issue.assignee.includes(a) || a.includes(issue.assignee))
      );
    }

    // 중요도 필터 (단일선택)
    if (filter?.priority && filter.priority !== 'all') {
      filtered = filtered.filter((issue) => issue.priority === filter.priority);
    }

    // 상태 필터 (단일선택)
    if (filter?.status && filter.status !== 'all') {
      filtered = filtered.filter((issue) => issue.status === filter.status);
    }

    // 날짜 필터
    if (filter?.startDate) {
      filtered = filtered.filter((issue) => issue.reportDate >= filter.startDate!);
    }
    if (filter?.endDate) {
      filtered = filtered.filter((issue) => issue.reportDate <= filter.endDate!);
    }

    // 정렬
    if (filter?.sortBy) {
      switch (filter.sortBy) {
        case 'latest':
          filtered.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
          break;
        case 'oldest':
          filtered.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
          break;
        case 'reportDate':
          filtered.sort((a, b) => new Date(b.reportDate).getTime() - new Date(a.reportDate).getTime());
          break;
        case 'priorityHigh': {
          const priorityOrder: Record<string, number> = { urgent: 0, normal: 1 };
          filtered.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
          break;
        }
        case 'priorityLow': {
          const priorityOrderLow: Record<string, number> = { urgent: 1, normal: 0 };
          filtered.sort((a, b) => priorityOrderLow[a.priority] - priorityOrderLow[b.priority]);
          break;
        }
      }
    }

    const page = filter?.page ?? 1;
    const size = filter?.size ?? 20;
    const start = (page - 1) * size;
    const paginatedItems = filtered.slice(start, start + size);

    return {
      success: true,
      data: {
        items: paginatedItems,
        total: filtered.length,
        page,
        size,
        totalPages: Math.ceil(filtered.length / size),
      },
    };
  } catch (error) {
    console.error('getIssueList error:', error);
    return { success: false, error: '이슈 목록 조회에 실패했습니다.' };
  }
}

// 이슈 통계 조회
export async function getIssueStats(): Promise<{
  success: boolean;
  data?: IssueStats;
  error?: string;
}> {
  try {
    const received = mockIssues.filter((i) => i.status === 'received').length;
    const inProgress = mockIssues.filter((i) => i.status === 'in_progress').length;
    const resolved = mockIssues.filter((i) => i.status === 'resolved').length;
    const unresolved = mockIssues.filter((i) => i.status === 'unresolved').length;

    return {
      success: true,
      data: {
        received,
        inProgress,
        resolved,
        unresolved,
      },
    };
  } catch (error) {
    console.error('getIssueStats error:', error);
    return { success: false, error: '이슈 통계 조회에 실패했습니다.' };
  }
}

// 이슈 상세 조회
export async function getIssue(
  id: string
): Promise<{ success: boolean; data?: Issue; error?: string }> {
  try {
    const issue = mockIssues.find((i) => i.id === id);

    if (!issue) {
      return { success: false, error: '이슈를 찾을 수 없습니다.' };
    }

    return { success: true, data: issue };
  } catch (error) {
    console.error('getIssue error:', error);
    return { success: false, error: '이슈 조회에 실패했습니다.' };
  }
}

// 이슈 수정
export async function updateIssue(
  _id: string,
  _data: Partial<Issue>
): Promise<{ success: boolean; error?: string }> {
  // 실제 구현에서는 DB 업데이트
  return { success: true };
}

// 이슈 생성
export async function createIssue(
  data: Omit<Issue, 'id' | 'createdAt' | 'updatedAt'>
): Promise<{ success: boolean; data?: Issue; error?: string }> {
  try {
    const newIssue: Issue = {
      ...data,
      id: `new-${Date.now()}`,
      createdAt: new Date().toISOString(),
      updatedAt: new Date().toISOString(),
    };
    return { success: true, data: newIssue };
  } catch (error) {
    console.error('createIssue error:', error);
    return { success: false, error: '이슈 등록에 실패했습니다.' };
  }
}

// 이슈 철회 (단일)
export async function withdrawIssue(
  _id: string
): Promise<{ success: boolean; error?: string }> {
  // 실제 구현에서는 DB 상태 업데이트 (삭제가 아닌 철회 상태로 변경)
  return { success: true };
}

// 이슈 철회 (다중)
export async function withdrawIssues(
  _ids: string[]
): Promise<{ success: boolean; error?: string }> {
  // 실제 구현에서는 DB 상태 일괄 업데이트
  return { success: true };
}