package com.madeu.common.service.impl;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import com.madeu.common.dao.CommonDao;
import com.madeu.common.service.AttachFileService;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class AttachFileServiceImpl implements AttachFileService {
    
    @Value("${file.upload-path}")
    private String uploadPath;
    
    @Autowired
    private CommonDao cmmnDAO;
    
    
    private static final Set<String> ALLOWED_EXTENSIONS = 
        Set.of("jpg", "jpeg", "png", "gif", "pdf", "doc", "docx", "txt");
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
    
    public Map<String, Object> saveAttachFile(String folder, MultipartFile file) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 파일 유효성 검사
            validateFile(file);
            
            // 파일 경로 생성
            String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            Path uploadDir = Paths.get(uploadPath, folder, datePath);
            Files.createDirectories(uploadDir);
            
            // 파일명 처리
            String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());
            String extension = getFileExtension(originalFilename);
            String safeFilename = generateSafeFilename(originalFilename, extension);
            
            // 파일 저장
            Path targetPath = uploadDir.resolve(safeFilename);
            Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
            
            // 결과 반환
            String relativePath = String.join("/", folder, datePath, safeFilename);
            result.put("success", true);
            result.put("filePath", relativePath);
            result.put("attachfileNm", safeFilename);
            result.put("orgAttachfileNm", originalFilename);
            result.put("fileSize", file.getSize());
            result.put("fileType", extension);
            result.put("regId", getCurrentUserId());
            result.put("modId", getCurrentUserId());
            
            cmmnDAO.insert("AttachFileSql.saveAttachFile", result);
            
            log.info("파일 업로드 성공: {}", relativePath);
            
        } catch (Exception e) {
            log.error("파일 업로드 실패: {}", e.getMessage());
            result.put("success", false);
            result.put("error", e.getMessage());
        }
        
        return result;
    }
    
    private void validateFile(MultipartFile file) throws IllegalArgumentException {
        if (file.isEmpty()) {
            throw new IllegalArgumentException("파일이 비어있습니다.");
        }
        
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new IllegalArgumentException("파일 크기가 너무 큽니다. (최대 10MB)");
        }
        
        String extension = getFileExtension(file.getOriginalFilename());
        if (!ALLOWED_EXTENSIONS.contains(extension.toLowerCase())) {
            throw new IllegalArgumentException("허용되지 않는 파일 형식입니다.");
        }
    }
    
    private String getFileExtension(String filename) {
        return filename.substring(filename.lastIndexOf(".") + 1);
    }
    
    private String generateSafeFilename(String originalFilename, String extension) {
        String nameWithoutExt = originalFilename.substring(0, originalFilename.lastIndexOf('.'));
        String sanitizedName = nameWithoutExt.replaceAll("[^a-zA-Z0-9가-힣]", "_");
        return sanitizedName + "_" + System.currentTimeMillis() + "." + extension;
    }
    
    private String getCurrentUserId() {
        try {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            
            if (requestAttributes instanceof ServletRequestAttributes) {
                HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
                HttpSession session = request.getSession();
                
                // 세션에서 사용자 ID 가져오기 (로그인 시 저장한 키 사용)
                Object userIdObj = session.getAttribute("loginId"); // 또는 "userId", "loginId" 등
                
                if (userIdObj != null) {
                    return userIdObj.toString();
                }
                
                // 세션 ID를 사용자 ID로 사용하는 경우
                return session.getId();
            }
        } catch (Exception e) {
            log.warn("사용자 정보를 가져올 수 없습니다: {}", e.getMessage());
        }
        
        return "SYSTEM"; // 기본값
    }
}

