package cokr.xit.fims.base;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.URISyntaxException;
import java.net.URLDecoder;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import cokr.xit.base.file.dao.FileMapper;
import cokr.xit.base.file.service.FileQuery;
import cokr.xit.base.file.service.bean.FileBean;

@Controller
public class FileController extends cokr.xit.base.file.web.FileController {
	@Resource(name = "fileMapper")
	private FileMapper fileMapper;

	@Resource(name="fileBean")
	private FileBean fileBean;

    @Override
    public ModelAndView getFileList(FileQuery req) {
		return setCollectionInfo(
				new ModelAndView("jsonView"),
				fileService().getFileList(req),
				"file"
			);
    }

    /** 메뉴얼을 다운로드한다.
	 * @return 메뉴얼 파일
     * @throws Exception
	 */
    @GetMapping(name = "메뉴얼 다운로드", value = "/downloadMenual.do")
	public ModelAndView downloadMenual() throws Exception {
    	ModelAndView mav = new ModelAndView("downloadView");

    	String filePath = ("menual/메뉴얼.pptx");
		ClassPathResource cps = new ClassPathResource(filePath);
		InputStream menualIS = cps.getInputStream();

		mav.addObject("file", menualIS);
		mav.addObject("filename", "메뉴얼.pptx");
		mav.addObject("contentType", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
		mav.addObject("length", menualIS.available());

		return mav;
	}


	@GetMapping(name = "SVG 이미지 파일 색상 변경", value = "/modifySvg/**")
	public void modifySvg(HttpServletRequest request, HttpServletResponse response) throws URISyntaxException, IOException, ParserConfigurationException, SAXException {
        String requestURI = request.getRequestURI().toString();

        String filepath = requestURI.split("modifySvg")[1];
        filepath = URLDecoder.decode(filepath);
        filepath = filepath.replace("\\","/");
        String svgRootPath = ("classpath:svg");
        filepath = svgRootPath + filepath;

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        Document document = documentBuilder.parse(filepath);
        Element root = document.getDocumentElement();
        NodeList nodeList = root.getChildNodes();

        try {
            String modify = request.getParameter("modify");
            if(modify == null || modify.equals("")){

            } else if(modify.equals("active")){
               updateTagFillColor(nodeList, "green");
            } else if(modify.equals("alert")){
               updateTagFillColor(nodeList, "red");
            }

            String str4 = DocumentToString(document);
            byte[] bytes = str4.getBytes();

            response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
            response.setHeader(HttpHeaders.CONTENT_TYPE, "image/svg+xml");
            response.setHeader(HttpHeaders.CONNECTION, "keep-alive");
            response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
            response.setHeader("Pragma", "no-cache");
            response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, must-revalidate");
            response.setDateHeader(HttpHeaders.EXPIRES, 0);
            response.setHeader(HttpHeaders.CONTENT_LENGTH, Integer.toString(bytes.length));
            response.setContentType("image/svg+xml");

            OutputStream os = response.getOutputStream();
            os.write(bytes);
            os.flush();
            os.close();


        } catch (Exception e){

        }


    }



    public static String DocumentToString( Document doc )
    {
        try
        {
            StringWriter clsOutput = new StringWriter( );
            Transformer clsTrans = TransformerFactory.newInstance( ).newTransformer( );

            clsTrans.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" );
            clsTrans.setOutputProperty( OutputKeys.METHOD, "xml" );
            clsTrans.setOutputProperty( OutputKeys.INDENT, "yes" );
            clsTrans.setOutputProperty( OutputKeys.ENCODING, "UTF-8" );

            clsTrans.transform( new DOMSource( doc ), new StreamResult( clsOutput ) );

            return clsOutput.toString( );
        }
        catch( Exception ex )
        {
            return "";
        }
    }

    private void updateTagFillColor(NodeList nodeList, String newFillColor) {

        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            NamedNodeMap namedNodeMap = node.getAttributes();
            if(namedNodeMap != null && namedNodeMap.getLength() > 0){
                for (int j = 0; j < namedNodeMap.getLength(); j++) {
                    Node namedNode = namedNodeMap.item(j);
                    if (namedNode.getNodeName().equalsIgnoreCase("fill")) {
                        namedNode.setNodeValue(newFillColor); // Change the color of the fill attribute.
                    }
                }
            }
        }
    }


}