/**
 * 출퇴근 관리 스크립트 
 */
G.init = G.init || {};

G.init.attendance = function() {
    if (typeof kakao !== 'undefined' && kakao.maps) {
        kakao.maps.load(function() {
            G.attendance.drawMap();
        });
    }
};

G.attendance = {
    map: null,
    userOverlay: null,      
    activeOfficeOverlay: null, 
    geocoder: null,
    isProcessing: false,    
    companyMarkers: [],     
    
    defaultCoord: { lat: 37.4792543, lng: 126.8847288 }, 
    fixedLevel: 4, 

    drawMap: function() {
        const $container = $('#attendance_map');
        if ($container.length === 0) return;

        try {
            this.geocoder = new kakao.maps.services.Geocoder();
        } catch (e) { console.error("Geocoder load fail"); }

        const options = {
            center: new kakao.maps.LatLng(this.defaultCoord.lat, this.defaultCoord.lng),
            level: this.fixedLevel 
        };
        this.map = new kakao.maps.Map($container[0], options);

        this.userOverlay = new kakao.maps.CustomOverlay({
            content: '<div class="user-location-dot"></div>',
            zIndex: 5
        });

        this.bindEvents();
        this.loadOfficeList(); 
        this.syncLocation(true); 

        setTimeout(() => { 
            if (this.map) {
                this.map.relayout();
                const pos = this.userOverlay.getPosition();
                if (pos) this.map.setCenter(pos);
            }
        }, 500);
    },

    //지사 정보 리스트 가져오기
    loadOfficeList: function() {
        const corpCode = serverData.corp_code || '1000'; 
        requestAstro(`lxsmartoffice/v1/office/offices/${corpCode}`, {}, 'get')
            .then(r => {
                if (r.code === '0000' && Array.isArray(r.data)) {
                    this.displayOfficeMarkers(r.data);
                }
            })
            .catch(err => console.error("Office Load Fail:", err));
    },

    //회사 위치 마커
    displayOfficeMarkers: function(offices) {
        offices.forEach(office => {
            const lat = parseFloat(office.latitude);
            const lng = parseFloat(office.longitude);
            if (isNaN(lat) || isNaN(lng)) return;

            const pos = new kakao.maps.LatLng(lat, lng);
            const marker = new kakao.maps.Marker({
                map: this.map,
                position: pos
            });

            const contentHtml = `
                <div class="office-overlay">
                    <span class="name">${office.name}</span>
                    <span class="addr">${office.road_address || office.legacy_address || ''}</span>
                </div>
            `;

            const overlay = new kakao.maps.CustomOverlay({
                content: contentHtml,
                position: pos,
                yAnchor: 1 
            });

            kakao.maps.event.addListener(marker, 'click', () => {
                if (this.activeOfficeOverlay) {
                    this.activeOfficeOverlay.setMap(null);
                }
                overlay.setMap(this.map);
                this.activeOfficeOverlay = overlay;
                this.map.panTo(pos);
            });

            this.companyMarkers.push(marker);
        });

        kakao.maps.event.addListener(this.map, 'click', () => {
            if (this.activeOfficeOverlay) {
                this.activeOfficeOverlay.setMap(null);
                this.activeOfficeOverlay = null;
            }
        });
    },


    /**
     * 위치 동기화
     * @param {*} isFirst - 최초 호출 여부 구분
     */
    syncLocation: function(isFirst, callback) {
        if (!navigator.geolocation) {
            if (!isFirst) popAlert("이 기기는 위치 정보를 지원하지 않습니다.");
            return;
        }

        if (!isFirst && typeof checkLoaderWrap === 'function') {
            checkLoaderWrap('plus');
        }

        navigator.geolocation.getCurrentPosition((pos) => {
            const lat = pos.coords.latitude;
            const lng = pos.coords.longitude;
            const myPos = new kakao.maps.LatLng(lat, lng);

            this.userOverlay.setPosition(myPos);
            this.userOverlay.setMap(this.map);
            this.updateAddressText(lat, lng);

            this.map.relayout();
            this.map.setCenter(myPos);

            if (!isFirst && typeof checkLoaderWrap === 'function') {
                checkLoaderWrap('minus');
            }

            if (typeof callback === 'function') callback(myPos);
        }, (err) => {
            if (!isFirst && typeof checkLoaderWrap === 'function') {
                checkLoaderWrap('minus');
            }
            
            console.warn("GPS Fail:", err.message);
            let errorMsg = "현재 위치를 가져오는데 실패했습니다.";
            switch(err.code) {
                case err.PERMISSION_DENIED:
                    errorMsg = "위치 정보 접근 권한이 거부되었습니다. 위치 권한을 허용해주세요.";
                    break;
                case err.POSITION_UNAVAILABLE: //수신불량
                    errorMsg = "위치 정보를 사용할 수 없습니다.";
                    break;
                case err.TIMEOUT:
                    errorMsg = "위치 측정 시간이 초과되었습니다. 다시 시도해주세요.";
                    break;
            }
            if (!isFirst) popAlert(errorMsg);
        }, {
            enableHighAccuracy: true,
            timeout: 10000,
            maximumAge: 0
        });
    },

    //지오 코더로 주소 넣기
    updateAddressText: function(lat, lng) {
        if (!this.geocoder) return;
        this.geocoder.coord2Address(lng, lat, (result, status) => {
            if (status === kakao.maps.services.Status.OK) {
                const addr = result[0].road_address ? result[0].road_address.address_name : result[0].address.address_name;
                // $('#attendance_address').html('<i class="bi bi-geo-alt-fill" style="color:#ff3b30;"></i> ' + addr);
                $('#attendance_address').text(addr);
            }
        });
    },

    //버튼 이벤트
    bindEvents: function() {
    $('.attendance_wrapper .blue_fill').off('click.att').on('click.att', (e) => {
        e.preventDefault();
        if (this.isProcessing) return;

        const $btn = $(e.currentTarget);
        const attendType = $btn.data('type').toString(); 
        const typeName = (attendType === "1" ? "출근" : "퇴근");
        this.syncLocation(false, (latestPos) => {

            this.sendAttendanceApi(attendType, typeName, latestPos); 
        });
    });
},

    /**
     * 출퇴근 전송
     */
    sendAttendanceApi: function(attendType, typeName, latestPos) {
    this.isProcessing = true;

    const params = {
        corp_code: serverData.corp_code,
        user_id: userData.userId,
        latitude: latestPos.getLat().toString(),
        longitude: latestPos.getLng().toString(),
        attend_type: attendType 
    };

    requestAstro('lxsmartoffice/v1/liveattend/send', params, 'post')
        .then(r => {
            if (r.code === '0000' || r.success === true) {
                popAlert(`${typeName} 정보가 정상적으로 전송되었습니다.`);
            } 
            else if (r.code === 'LX1004') {
                popAlert(r.message || "출퇴근등록 유효 범위를 벗어났습니다. 근무지에서 요청해주세요.");
            } 
            else {
                popAlert(r.message || "처리 중 오류가 발생했습니다.");
            }
        })
        .catch(err => {
            console.error('Attendance API Error:', err);
            popAlert("서버와의 통신에 실패했습니다.");
        })
        .finally(() => {
            this.isProcessing = false;
            if (typeof checkLoaderWrap === 'function') checkLoaderWrap('minus');
        });
    }
};