/*!
 * Theme Name: 		   OceanWP
 * Text Domain: 	   oceanwp
 * Version:            4.1.2
 * Tested up to:       6.8.2
 * Requires at least:  5.6
 * Requires PHP:       7.4
 * Author:             OceanWP
 * Author URI:         https://oceanwp.org/about-oceanwp/
 * Theme URI:          https://oceanwp.org/
 * Description:        OceanWP is the perfect theme for your project. Lightweight and highly extendable, it will enable you to create almost any type of website such a blog, portfolio, business website and WooCommerce storefront with a beautiful & professional design. Very fast, responsive, RTL & translation ready, best SEO practices, unique WooCommerce features to increase conversion and much more. You can even edit the settings on tablet & mobile so your site looks good on every device. Work with the most popular page builders as Elementor, Beaver Builder, Brizy, Visual Composer, Divi, SiteOrigin, etc... Developers will love his extensible codebase making it a joy to customize and extend. Best friend of Elementor & WooCommerce. Looking for a Multi-Purpose theme? Look no further! Check the demos to realize that it's the only theme you will ever need: https://oceanwp.org/demos/
 * Tags:               two-columns, right-sidebar, footer-widgets, blog, news, custom-background, custom-menu, post-formats, rtl-language-support, sticky-post, editor-style, threaded-comments, translation-ready, buddypress, custom-colors, featured-images, full-width-template, theme-options, e-commerce, block-styles, wide-blocks, accessibility-ready
 *
 * License: GNU General Public License v2.0 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 *
 * All files, unless otherwise stated, are released under the GNU General Public
 * License version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html)

 * This theme, like WordPress, is licensed under the GPL.
 * Use it to make something cool, have fun, and share what you've learned
 * with others.
 *
 * DO NOT ADD YOUR CSS TO THIS FILE - IT WILL BE LOST
 * To add your own CSS, use a child theme: https://github.com/oceanwp/oceanwp-child-theme
 *
 * CSS file is in "assets/css"

function employee_counter_shortcode() {
    ob_start();
    ?>
    <div id="emp-counter-app" style="max-width: 1000px; margin: 20px auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
        <h1 style="color: #333; text-align: center; margin-bottom: 10px;">🧑‍💼 사원 팀 카운팅 시스템</h1>
        <p style="text-align: center; color: #666; margin-bottom: 30px;">총 120명의 사원 명단</p>
        
        <div style="margin: 15px 0;">
            <label style="display: block; margin-bottom: 5px; font-weight: bold; color: #555;">사원번호 범위 (끝 번호)</label>
            <input type="number" id="emp-range-end" placeholder="1-120 사이 입력" min="1" max="120" style="width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 5px; font-size: 14px; box-sizing: border-box;">
            <div style="font-size: 12px; color: #888; margin-top: 3px;">항상 1번부터 시작합니다</div>
        </div>

        <div style="margin: 15px 0;">
            <label style="display: block; margin-bottom: 5px; font-weight: bold; color: #555;">1부 팀수</label>
            <input type="number" id="emp-team1" placeholder="예: 67" min="0" style="width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 5px; font-size: 14px; box-sizing: border-box;">
        </div>

        <div style="margin: 15px 0;">
            <label style="display: block; margin-bottom: 5px; font-weight: bold; color: #555;">2부 팀수</label>
            <input type="number" id="emp-team2" placeholder="예: 67" min="0" style="width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 5px; font-size: 14px; box-sizing: border-box;">
        </div>

        <div style="margin: 15px 0;">
            <label style="display: block; margin-bottom: 5px; font-weight: bold; color: #555;">시작 사원번호</label>
            <input type="number" id="emp-start" placeholder="예: 23" min="1" max="120" style="width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 5px; font-size: 14px; box-sizing: border-box;">
        </div>

        <div style="margin: 15px 0;">
            <label style="display: block; margin-bottom: 5px; font-weight: bold; color: #555;">휴무자 명수 (랜덤 선택)</label>
            <input type="number" id="emp-dayoff" placeholder="예: 17" min="0" style="width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 5px; font-size: 14px; box-sizing: border-box;">
            <div style="font-size: 12px; color: #888; margin-top: 3px;">입력한 명수만큼 랜덤으로 선택됩니다</div>
        </div>

        <div style="margin: 15px 0;">
            <label style="display: block; margin-bottom: 5px; font-weight: bold; color: #555;">제외할 사원번호 (확정)</label>
            <input type="text" id="emp-excluded" placeholder="예: 10, 25, 37 (쉼표로 구분)" style="width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 5px; font-size: 14px; box-sizing: border-box;">
            <div style="font-size: 12px; color: #888; margin-top: 3px;">특정 사원을 확정적으로 제외합니다</div>
        </div>

        <div style="margin: 20px 0; text-align: center;">
            <button id="emp-calc-btn" style="padding: 12px 30px; margin: 0 10px; font-size: 16px; border: none; border-radius: 5px; cursor: pointer; font-weight: bold; background: #667eea; color: white;">계산하기</button>
            <button id="emp-reset-btn" style="padding: 12px 30px; margin: 0 10px; font-size: 16px; border: none; border-radius: 5px; cursor: pointer; font-weight: bold; background: #e0e0e0; color: #333;">초기화</button>
        </div>

        <div id="emp-error-msg"></div>
        <div id="emp-result-table"></div>
    </div>

    <script>
    (function() {
        var empNames = {1:'김선희',2:'이지은',3:'최민지',4:'김주환',5:'오선정',6:'배인호',7:'김경헐',8:'정수아',9:'박지민',10:'제임스',11:'백성단',12:'이민선',13:'이임영',14:'최문희',15:'지재훈',16:'정소연',17:'강민준',18:'윤서준',19:'장예준',20:'엠마',21:'한지후',22:'조승우',23:'최준서',24:'강도윤',25:'홍서진',26:'송민재',27:'양유준',28:'고현우',29:'권지훈',30:'올리비아',31:'서은우',32:'남건우',33:'유시윤',34:'문태양',35:'진하준',36:'배수현',37:'노승현',38:'설지안',39:'마준영',40:'윌리엄',41:'안서연',42:'류민서',43:'탁하은',44:'도지우',45:'표서현',46:'채아인',47:'맹다은',48:'소예은',49:'석수아',50:'소피아',51:'천지아',52:'엄채원',53:'금서윤',54:'방시연',55:'복소율',56:'견민주',57:'피다현',58:'옹예린',59:'공지유',60:'벤자민',61:'사재민',62:'곽태민',63:'국동현',64:'염예찬',65:'나지호',66:'진성민',67:'어승준',68:'편은찬',69:'여도현',70:'샬롯',71:'추민우',72:'제하율',73:'모건',74:'근태윤',75:'갈우빈',76:'등지환',77:'명태준',78:'뇌재윤',79:'단민성',80:'마이클',81:'평시온',82:'제갈민',83:'황보연',84:'독고준',85:'남궁찬',86:'사공우',87:'선율',88:'설하',89:'별하',90:'이사벨라',91:'다온',92:'라온',93:'가온',94:'나래',95:'한결',96:'소담',97:'온유',98:'은채',99:'서아',100:'알렉산더',101:'하윤',102:'수빈',103:'예린',104:'지윤',105:'서준',106:'도윤',107:'예준',108:'하준',109:'지후',110:'아바',111:'민준',112:'시우',113:'유준',114:'준서',115:'건우',116:'우진',117:'현우',118:'선우',119:'연우',120:'다니엘'};

        function calculate() {
            var errorDiv = document.getElementById('emp-error-msg');
            var resultDiv = document.getElementById('emp-result-table');
            try {
                var endNum = parseInt(document.getElementById('emp-range-end').value);
                var team1Num = parseInt(document.getElementById('emp-team1').value);
                var team2Num = parseInt(document.getElementById('emp-team2').value);
                var startNum = parseInt(document.getElementById('emp-start').value);
                var dayOffNum = parseInt(document.getElementById('emp-dayoff').value) || 0;
                var excludedStr = document.getElementById('emp-excluded').value;
                if (isNaN(endNum) || isNaN(team1Num) || isNaN(team2Num) || isNaN(startNum)) throw new Error('필수 항목을 모두 입력해주세요!');
                if (endNum < 1 || endNum > 120) throw new Error('사원번호 끝은 1-120 사이여야 합니다!');
                if (startNum < 1 || startNum > endNum) throw new Error('시작 사원번호가 범위를 벗어났습니다!');
                var fixedExcluded = [];
                if (excludedStr.trim() !== '') {
                    var parts = excludedStr.split(',');
                    for (var i = 0; i < parts.length; i++) {
                        var num = parseInt(parts[i].trim());
                        if (!isNaN(num) && num >= 1 && num <= endNum) fixedExcluded.push(num);
                    }
                }
                if (fixedExcluded.indexOf(startNum) !== -1) throw new Error('시작 사원번호는 제외할 수 없습니다!');
                var allEmployees = [];
                for (var i = 1; i <= endNum; i++) allEmployees.push(i);
                var availableForRandom = [];
                for (var i = 0; i < allEmployees.length; i++) {
                    var emp = allEmployees[i];
                    if (emp !== startNum && fixedExcluded.indexOf(emp) === -1) availableForRandom.push(emp);
                }
                var randomExcluded = [];
                if (dayOffNum > 0) {
                    if (dayOffNum > availableForRandom.length) throw new Error('휴무자 명수가 너무 많습니다!');
                    var shuffled = availableForRandom.slice();
                    for (var i = shuffled.length - 1; i > 0; i--) {
                        var j = Math.floor(Math.random() * (i + 1));
                        var temp = shuffled[i]; shuffled[i] = shuffled[j]; shuffled[j] = temp;
                    }
                    for (var i = 0; i < dayOffNum; i++) randomExcluded.push(shuffled[i]);
                    randomExcluded.sort(function(a, b) { return a - b; });
                }
                var allExcluded = fixedExcluded.concat(randomExcluded);
                var workingEmployees = [];
                for (var i = 0; i < allEmployees.length; i++) {
                    if (allExcluded.indexOf(allEmployees[i]) === -1) workingEmployees.push(allEmployees[i]);
                }
                if (workingEmployees.length === 0) throw new Error('근무 가능한 사원이 없습니다!');
                var startIndex = workingEmployees.indexOf(startNum);
                var totalNeeded = team1Num + team2Num;
                var assignments = {};
                var currentTeam = 1; var currentCount = 0;
                for (var i = 0; i < totalNeeded; i++) {
                    var idx = (startIndex + i) % workingEmployees.length;
                    var empNo = workingEmployees[idx];
                    var teamSize = currentTeam === 1 ? team1Num : team2Num;
                    if (!assignments[empNo]) assignments[empNo] = {teams: [], isStart: (empNo === startNum && i === 0)};
                    assignments[empNo].teams.push(currentTeam);
                    currentCount++;
                    if (currentCount >= teamSize) { currentCount = 0; currentTeam = currentTeam === 1 ? 2 : 1; }
                }
                var html = '<h2 style="margin-top:30px;">📊 팀 배정 결과</h2><table style="width:100%;border-collapse:collapse;margin-top:20px;"><tr><th style="border:1px solid #ddd;padding:12px;text-align:center;background:#667eea;color:white;">사원번호</th><th style="border:1px solid #ddd;padding:12px;text-align:center;background:#667eea;color:white;">이름</th><th style="border:1px solid #ddd;padding:12px;text-align:center;background:#667eea;color:white;">배정팀</th><th style="border:1px solid #ddd;padding:12px;text-align:center;background:#667eea;color:white;">상태</th></tr>';
                for (var i = 1; i <= endNum; i++) {
                    var bgColor = '', teamText = '', statusText = '';
                    if (allExcluded.indexOf(i) !== -1) {
                        bgColor = fixedExcluded.indexOf(i) !== -1 ? '#ffcccc' : '#ffffcc';
                        teamText = '휴무'; statusText = fixedExcluded.indexOf(i) !== -1 ? '확정제외' : '랜덤휴무';
                    } else if (assignments[i]) {
                        var assign = assignments[i];
                        if (assign.isStart) { bgColor = '#d4edda'; statusText = '🟢 시작'; }
                        else if (assign.teams.length > 1) { bgColor = '#e2d5f3'; statusText = '🔁 투근무'; }
                        else if (assign.teams[0] === 1) bgColor = '#cce5ff';
                        else bgColor = '#ffe5cc';
                        teamText = assign.teams.join('부, ') + '부';
                    }
                    html += '<tr style="background:' + bgColor + ';"><td style="border:1px solid #ddd;padding:12px;text-align:center;">' + i + '</td><td style="border:1px solid #ddd;padding:12px;text-align:center;">' + empNames[i] + '</td><td style="border:1px solid #ddd;padding:12px;text-align:center;">' + teamText + '</td><td style="border:1px solid #ddd;padding:12px;text-align:center;">' + statusText + '</td></tr>';
                }
                html += '</table>';
                var team1Count = 0, team2Count = 0, doubleCount = 0;
                for (var key in assignments) {
                    if (assignments[key].teams.indexOf(1) !== -1) team1Count++;
                    if (assignments[key].teams.indexOf(2) !== -1) team2Count++;
                    if (assignments[key].teams.length > 1) doubleCount++;
                }
                html += '<div style="margin-top:20px;padding:15px;background:#f9f9f9;border-radius:5px;"><strong>📈 요약:</strong> 1부팀 ' + team1Count + '명 | 2부팀 ' + team2Count + '명 | 투근무 ' + doubleCount + '명 | 총 휴무 ' + allExcluded.length + '명</div>';
                resultDiv.innerHTML = html; errorDiv.innerHTML = '';
            } catch (error) {
                errorDiv.innerHTML = '<div style="background:#ffe0e0;color:#cc0000;padding:15px;border-radius:5px;margin:15px 0;border:1px solid #ffcccc;">⚠️ ' + error.message + '</div>';
                resultDiv.innerHTML = '';
            }
        }
        function reset() {
            document.getElementById('emp-range-end').value = '';
            document.getElementById('emp-team1').value = '';
            document.getElementById('emp-team2').value = '';
            document.getElementById('emp-start').value = '';
            document.getElementById('emp-dayoff').value = '';
            document.getElementById('emp-excluded').value = '';
            document.getElementById('emp-error-msg').innerHTML = '';
            document.getElementById('emp-result-table').innerHTML = '';
        }
        document.getElementById('emp-calc-btn').addEventListener('click', calculate);
        document.getElementById('emp-reset-btn').addEventListener('click', reset);
    })();
    </script>
    <?php
    return ob_get_clean();
}
add_shortcode('employee_counter', 'employee_counter_shortcode');   

      
      
              
                