/**
 * <p>결과파일 생성</p>
 * @param 
 * @param 
 * @return
 */
export function fn_getJsonFile(img) {
    /* 처리구조 셋팅 */
    let   rtn     = {};
    let   jsonObj = {};                 // 리턴Json

    /* 기본정보 셋팅 */
    jsonObj.version     = "1.0.0";      // version
    jsonObj.imagePath   = img.name;     // Image File Name
    jsonObj.imageData   = "";           // Encoded Image(?)
    jsonObj.flags       = {};           // flags
    jsonObj.shapes      = [];           // Regions
    
    /* Region 정보셋팅 */
    if(img.regions && img.pixelSize){
        const scaleX  = img.pixelSize.w;    // Image Height
        const scaleY  = img.pixelSize.h;    // Image Width
        jsonObj.imageWidth  = scaleX;       // Image Width
        jsonObj.imageHeight = scaleY;       // Image Height

        for(let i = 0; i < img.regions.length; i++){
            const region   = img.regions[i];
            let   o_region = {};
            let   o_points = [];
    
            if(!region.cls){
                rtn.region = region;
            }
    
            /* 기본정보 */
            o_region.label    = region.cls;         // 클래스
            o_region.tags     = region.tags;        // Tags
            o_region.group_id = null;               // 그룹ID
            o_region.flags    = {};                 // flags
    
            /* Resion */
            // Bounding Box
            if(region.type === 'box'){
                o_region.shape_type = "rectangle";  // Resion Type
                const x_min = region.x * scaleX;
                const y_min = region.y * scaleY;
                const x_max = (region.x + region.w) * scaleX;
                const y_max = (region.y + region.h) * scaleY;
    
                o_points = [[x_min, y_min], [x_max, y_max]];;
                o_region.points = o_points;
            }
    
            // Potin
            else if(region.type === 'point'){
                o_region.shape_type = "point";      // Resion Type
                o_points = [region.x * scaleX, region.y * scaleY];
                o_region.points = o_points;
            }
            
            // Polygon
            else if(region.type === 'polygon'){
                o_region.shape_type = "polygon";    // Resion Type
                
                for(let j = 0; j < region.points.length; j++){
                    o_points[j] = [region.points[j][0] * scaleX, region.points[j][1] * scaleY];
                }
    
                o_region.points = o_points;
            }
    
            
            jsonObj.shapes[i] = o_region;
        }
    }

    rtn.json = jsonObj;
    rtn.img  = img;

    return rtn;
}


/**
 * <p>결과파일 생성</p>
 * @param 
 * @param 
 * @return
 */
export function fn_getXmlFile(img, openAlert) {
        // var xmlString    = new XMLSerializer().serializeToString(result);
        // var xmlFormat    = require('xml-formatter');
        // var options      = {indentation: '    ', stripComments: true, collapseContent: true, lineSeparator: '\n'}
        // var formattedXml = xmlFormat(xmlString, options);
        // var blobFile     = new Blob([formattedXml], {type: 'text/xml'});
        // var file_nm      = p_images[selectedIndex].name;
        // file_nm          = file_nm.substring(0, file_nm.lastIndexOf('.') + 1) + 'xml';
        // saveAs(blobFile, file_nm);

    const scaleX = img.pixelSize.w;
    const scaleY = img.pixelSize.h;
    
    const xmlDoc     = document.implementation.createDocument("", "", null);
    const annotation = xmlDoc.createElement("annotation");
    const folder     = xmlDoc.createElement("folder");
    const filename   = xmlDoc.createElement("filename");
    const path       = xmlDoc.createElement("path");
    const size       = xmlDoc.createElement("size");
    const width      = xmlDoc.createElement("width");
    const height     = xmlDoc.createElement("height");
    const depth      = xmlDoc.createElement("depth");
    
    // filename.innerHTML = p_images[selectedIndex].name;
    width.innerHTML    = scaleX;
    height.innerHTML   = scaleY;
    depth.innerHTML    = 3;
    
    size.appendChild(width);
    size.appendChild(height);
    size.appendChild(depth);

    annotation.appendChild(folder);
    annotation.appendChild(filename);
    annotation.appendChild(path);
    annotation.appendChild(size);

    for(var i = 0; i < img.regions.length; i++){
        const region    = img.regions[i];
        const object    = xmlDoc.createElement("object");
        const name      = xmlDoc.createElement("name");
        const pose      = xmlDoc.createElement("pose");
        const truncated = xmlDoc.createElement("truncated");
        const difficult = xmlDoc.createElement("difficult");

        if(!region.cls){
            let param = {};
            param.title     = "Xaiplanet 확인";
            param.msg_m     = '클래스가 지정되지 않은 객체가 있습니다.';

            openAlert(param);
            return { region : region };
        }

        name.innerHTML      = region.cls;
        pose.innerHTML      = 'Unspecified';
        truncated.innerHTML = 0;
        difficult.innerHTML = 0;

        object.appendChild(name);            
        object.appendChild(pose);            
        object.appendChild(truncated);            
        object.appendChild(difficult);     
        
        // Bounding Box
        if(region.type === 'box'){
            object.appendChild(getBoxRegionForXML(xmlDoc, region, scaleX, scaleY));  
        }

        // Potin
        else if(region.type === 'point'){
            object.appendChild(getPointRegionForXML(xmlDoc, region, scaleX, scaleY));  
        }

        // Polygon
        else if(region.type === 'polygon'){
            object.appendChild(getPolygonRegionForXML(xmlDoc, region, scaleX, scaleY));
        }
        
        annotation.appendChild(object);
    }

    xmlDoc.appendChild(annotation);

    return xmlDoc;
}

const getBoxRegionForXML = (xmlDoc, region, scaleX, scaleY) => {
    const bndbox = xmlDoc.createElement("bndbox");
    const xmin   = xmlDoc.createElement("xmin");
    const ymin   = xmlDoc.createElement("ymin");
    const xmax   = xmlDoc.createElement("xmax");
    const ymax   = xmlDoc.createElement("ymax");     
    
    xmin.innerHTML = parseInt(region.x * scaleX);
    ymin.innerHTML = parseInt(region.y * scaleY);
    xmax.innerHTML = parseInt((region.x + region.w) * scaleX);
    ymax.innerHTML = parseInt((region.y + region.h) * scaleY);

    bndbox.appendChild(xmin);
    bndbox.appendChild(ymin);
    bndbox.appendChild(xmax);
    bndbox.appendChild(ymax);

    return bndbox;
}

const getPointRegionForXML = (xmlDoc, region, scaleX, scaleY) => {
    const point = xmlDoc.createElement("point");
    const x     = xmlDoc.createElement("x");
    const y     = xmlDoc.createElement("y");
    
    x.innerHTML = parseInt(region.x * scaleX);
    y.innerHTML = parseInt(region.y * scaleY);

    point.appendChild(x);
    point.appendChild(y);

    return point;
}

const getPolygonRegionForXML = (xmlDoc, region, scaleX, scaleY) => {
    const polygon = xmlDoc.createElement("polygon");
    const points  = xmlDoc.createElement("points");
    
    for(var i = 0; i < region.points.length; i++){
        const point = xmlDoc.createElement("point");
        const x     = xmlDoc.createElement("x");
        const y     = xmlDoc.createElement("y");

        x.innerHTML = parseInt(region.points[i][0] * scaleX);
        y.innerHTML = parseInt(region.points[i][1] * scaleY);
        point.appendChild(x);
        point.appendChild(y);
        points.appendChild(point);
    }


    polygon.appendChild(points);

    return polygon;
}