import * as XLSX from 'xlsx-js-style';
import { ExcelDownButton } from '../../../styles/ModuleComponents';

const ExcelDownloadButton = ({ tableRef, fileName = 'download.xlsx', sheetName = 'Sheet1' }) => {
	const isNumeric = (value) => {
		// 숫자 또는 숫자 문자열인지 확인
		return !isNaN(value) && !isNaN(parseFloat(value));
	};

	const downloadExcel = () => {
		try {
			if (!tableRef.current) return;

			const tableElement = tableRef.current;
			const headerRows = tableElement.getElementsByTagName('thead')[0].getElementsByTagName('tr');
			const bodyRows = tableElement.getElementsByTagName('tbody')[0].getElementsByTagName('tr');

			// 헤더 데이터 추출
			const headers = Array.from(headerRows[0].cells).map(cell => cell.textContent);

			// 바디 데이터 추출 및 숫자 타입 처리
			const bodyData = Array.from(bodyRows).map(row =>
				Array.from(row.cells).map(cell => {
					const value = cell.textContent;
					return isNumeric(value) ? parseFloat(value) : value;
				})
			);

			// 워크북 생성
			const wb = XLSX.utils.book_new();

			// 테두리 스타일 정의
			const borderStyle = {
				style: "thin",
				color: { rgb: "000000" }
			};

			// 스타일 정의
			const centerStyle = {
				font: {
					name: "맑은 고딕",
					sz: 11
				},
				alignment: {
					horizontal: 'right',
					vertical: 'right'
				},
				border: {
					top: borderStyle,
					bottom: borderStyle,
					left: borderStyle,
					right: borderStyle
				}
			};

			const headerStyle = {
				alignment: {
					horizontal: 'center',
					vertical: 'center'
				},
				fill: {
					fgColor: { rgb: "d9e1f2" },
					patternType: "solid"
				}
			};

			// 데이터에 스타일 적용
			const wsData = [
				// 헤더 행
				headers.map(h => ({
					v: h,
					s: headerStyle
				})),
				// 데이터 행들
				...bodyData.map(row =>
					row.map(cell => ({
						v: cell,
						s: centerStyle
					}))
				)
			];

			// 워크시트 생성
			const ws = XLSX.utils.aoa_to_sheet(wsData);

			// 열 너비 설정 (최소 8, 최대 50)
			ws['!cols'] = headers.map((_, index) => {
				const maxLength = Math.max(
					headers[index].length * 2,
					...bodyData.map(row => String(row[index] || '').length * 1.2)
				);
				return { wch: Math.max(8, Math.min(50, maxLength)) };
			});

			// 워크시트를 워크북에 추가
			XLSX.utils.book_append_sheet(wb, ws, sheetName);

			// 엑셀 파일 다운로드
			XLSX.writeFile(wb, fileName);
		} catch (error) {
			console.error('Excel download failed:', error);
			alert('엑셀 다운로드 중 오류가 발생했습니다.');
		}
	};

	return (
		<ExcelDownButton onClick={downloadExcel}>
			엑셀 다운로드
		</ExcelDownButton>
	);
};

export default ExcelDownloadButton;