import json
import os
import csv
from typing import Dict, List
from datetime import datetime

class EmployeeManager:
    """직원 정보 관리 클래스"""
    
    def __init__(self, data_file="employees.json"):
        self.data_file = data_file
        self.employees = self.load_employees()
    
    def load_employees(self) -> Dict[str, str]:
        """직원 데이터 로드 (JSON 파일에서)"""
        if os.path.exists(self.data_file):
            try:
                with open(self.data_file, 'r', encoding='utf-8') as f:
                    return json.load(f)
            except Exception as e:
                print(f"직원 데이터 로드 실패: {e}")
                return {}
        
        # 기본 직원 데이터
        default_employees = {
            "김혜리": "khr2205@iten.co.kr",
            "이준호": "tolag3@iten.co.kr",
            "이호영": "hylee@iten.co.kr",
            "유인식": "smartyu@iten.co.kr",
            "원영현": "dudgusw@iten.co.kr",
            "유찬희": "ych@iten.co.kr",
            "조현희": "hc3874@iten.co.kr",
            "강영묵": "ymkang@iten.co.kr",
            "조용준": "antelope@iten.co.kr",
            "우영두": "rosehips@iten.co.kr",
            "김상훈": "aricowiz@iten.co.kr",
            "장영익": "yeongik@iten.co.kr",
            "정다은": "jungde@iten.co.kr",
            "이지우": "dlwldn1024@iten.co.kr",
            "박진순": "jsp@iten.co.kr",
            "정수빈": "dhgksk99@iten.co.kr",
            "강민경": "kmk0522@iten.co.kr"
        }
        
        # 기본 데이터 저장
        self.save_employees_data(default_employees)
        return default_employees
    
    def save_employees(self):
        """직원 데이터 저장"""
        self.save_employees_data(self.employees)
    
    def save_employees_data(self, data: Dict[str, str]):
        """직원 데이터를 파일에 저장"""
        try:
            with open(self.data_file, 'w', encoding='utf-8') as f:
                json.dump(data, f, ensure_ascii=False, indent=2)
            
            # 백업 CSV 파일도 생성
            self.backup_to_csv(data)
        except Exception as e:
            print(f"직원 데이터 저장 실패: {e}")
    
    def backup_to_csv(self, data: Dict[str, str]):
        """CSV 백업 파일 생성"""
        try:
            backup_file = "employees_backup.csv"
            with open(backup_file, 'w', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(['이름', '이메일', '백업일시'])
                current_time = datetime.now().strftime('%Y-%m-%d %H:%M')
                for name, email in data.items():
                    writer.writerow([name, email, current_time])
        except Exception as e:
            print(f"CSV 백업 실패: {e}")
    
    def add_employee(self, name: str, email: str) -> bool:
        """직원 추가"""
        if name.strip() in self.employees:
            return False  # 이미 존재
        
        self.employees[name.strip()] = email.strip()
        self.save_employees()
        return True
    
    def update_employee(self, old_name: str, new_name: str, email: str) -> bool:
        """직원 정보 수정"""
        if old_name not in self.employees:
            return False
        
        old_name = old_name.strip()
        new_name = new_name.strip()
        email = email.strip()
        
        # 이름이 변경되는 경우
        if old_name != new_name:
            if new_name in self.employees:
                return False  # 새 이름이 이미 존재
            del self.employees[old_name]
        
        self.employees[new_name] = email
        self.save_employees()
        return True
    
    def delete_employee(self, name: str) -> bool:
        """직원 삭제"""
        if name in self.employees:
            del self.employees[name]
            self.save_employees()
            return True
        return False
    
    def get_employee_email(self, name: str) -> str:
        """직원 이메일 조회"""
        return self.employees.get(name.strip(), "")
    
    def get_all_employees(self) -> Dict[str, str]:
        """전체 직원 목록 반환"""
        return self.employees.copy()
    
    def search_employees(self, query: str) -> Dict[str, str]:
        """직원 검색"""
        query = query.lower().strip()
        if not query:
            return self.get_all_employees()
        
        result = {}
        for name, email in self.employees.items():
            if query in name.lower() or query in email.lower():
                result[name] = email
        return result
    
    def import_from_csv(self, file_path: str) -> tuple:
        """CSV 파일에서 직원 정보 가져오기"""
        success_count = 0
        error_list = []
        
        try:
            encodings = ['utf-8', 'cp949', 'euc-kr']
            for encoding in encodings:
                try:
                    with open(file_path, 'r', encoding=encoding) as f:
                        reader = csv.reader(f)
                        header = next(reader, None)  # 헤더 스킵
                        
                        for row_num, row in enumerate(reader, 2):
                            if len(row) >= 2:
                                name = row[0].strip()
                                email = row[1].strip()
                                
                                if name and email and '@' in email:
                                    if self.add_employee_silent(name, email):
                                        success_count += 1
                                    else:
                                        error_list.append(f"행 {row_num}: '{name}' 이미 존재")
                                else:
                                    error_list.append(f"행 {row_num}: 유효하지 않은 데이터")
                    break
                except UnicodeDecodeError:
                    continue
                    
        except Exception as e:
            error_list.append(f"파일 읽기 오류: {str(e)}")
        
        if success_count > 0:
            self.save_employees()
        
        return success_count, error_list
    
    def add_employee_silent(self, name: str, email: str) -> bool:
        """직원 추가 (저장하지 않음, 배치 처리용)"""
        if name.strip() in self.employees:
            return False
        
        self.employees[name.strip()] = email.strip()
        return True
    
    def export_to_csv(self, file_path: str) -> bool:
        """CSV 파일로 내보내기"""
        try:
            with open(file_path, 'w', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(['이름', '이메일'])  # 헤더
                
                for name, email in sorted(self.employees.items()):
                    writer.writerow([name, email])
            return True
        except Exception as e:
            print(f"CSV 내보내기 실패: {e}")
            return False
    
    def get_employee_count(self) -> int:
        """직원 수 반환"""
        return len(self.employees)
    
    def clear_all_employees(self):
        """모든 직원 정보 삭제"""
        self.employees.clear()
        self.save_employees()