package com.okami.plugin.scanner.core.common;

import com.okami.MonitorClientApplication;
import com.okami.plugin.scanner.bean.BaseTask;
import com.okami.plugin.scanner.bean.FileContent;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author wh1t3P1g
 * @since 2017/1/2
 */
@Component
@Scope("prototype")
public class EnumFiles {
    private BaseTask task;

    /**
     * 文件遍历+填充遍历到的文件属性到FileContent
     * @return List<FileContent>
     */
    public List<FileContent> run()
    {
        Path path= Paths.get(task.getFilePath());
        List<FileContent> fileContents=new ArrayList<FileContent>();
        ListFileTree listFileTree=new ListFileTree();
        try{
            Files.walkFileTree(path,listFileTree);
            for(Path path1:listFileTree.paths){
                FileContent fileContent=setAttrs(path1);
                if(fileContent!=null){
                    fileContents.add(fileContent);
                }
            }
            if(task.isFilter()){
                fileContents=this.filter(fileContents,task.getExceptPath(),task.getExceptExtension());
            }
            if(task.getMode()==1){//fast scanner
                fileContents=this.filter(fileContents,task.getScriptExtension());
            }
            return fileContents;
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }

    }

    private List<FileContent> filter(List<FileContent> fileContents,String extension){
        List<FileContent> lists=new ArrayList<>();
        List<String> extensions=Arrays.asList(extension.split(","));
        for (FileContent fileContent :fileContents) {
            String ext=fileContent.getFileExt();
            if(extensions.contains(ext)){
                lists.add(fileContent);
            }
        }
        return lists;
    }

    private List<FileContent> filter(List<FileContent> fileContents,String exceptPath,String exceptExtension){
        List<String> exceptPaths=null;
        List<String> exceptExtensions=null;
        if(exceptPath!=null&&!exceptPath.isEmpty())
            exceptPaths=Arrays.asList(exceptPath.split(","));
        if(exceptExtension!=null&&!exceptExtension.isEmpty())
            exceptExtensions=Arrays.asList(exceptExtension.split(","));


        List<FileContent> lists=new ArrayList<>();
        for (FileContent fileContent:fileContents) {
            String extension=fileContent.getFileExt();
            String dirname=fileContent.getDirname();
            dirname=dirname.substring(0,dirname.length()-1);
            if(exceptExtensions!=null&&
                    !exceptExtension.isEmpty()&&
                    exceptExtensions.contains(extension)){
                continue;
            }
            if(exceptPaths!=null&&
                    !exceptPath.isEmpty()){
                boolean flag=false;
                for (String path:exceptPaths) {
//                	System.out.println(path);
//                	System.out.println(dirname);
                    if(dirname.contains(path)){
                        flag=true;
                        break;
                    }
                }
                if(flag)
                    continue;
            }
            lists.add(fileContent);

        }
        return lists;
    }
    /**
     * 设置属性
     * @param path 文件路径
     * @return fileConent
     */
    public FileContent setAttrs(Path path) {
        try{
            if(Files.isDirectory(path))return null;
            DateFormat df = new SimpleDateFormat("yyyy/MM/dd H:m:s");
            FileContent fileContent= MonitorClientApplication.ctx.getBean(FileContent.class);
            String fileName=path.getFileName().toString();
            String dirname=path.toString().substring(0,path.toString().indexOf(fileName));
            String fileExt=fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();
            BasicFileAttributeView basicFileAttributeView=
                    Files.getFileAttributeView(path,BasicFileAttributeView.class);
            fileContent.setFilePath(path.toString());//文件全路径
            fileContent.setPath(path);
            fileContent.setDirname(dirname);
            fileContent.setFileName(fileName);//文件名
            fileContent.setFileExt(fileExt);//文件后缀名
            fileContent.setExecutable(Files.isExecutable(path));//是否可执行
            fileContent.setWriteable(Files.isWritable(path));//是否可写
            fileContent.setReadable(Files.isReadable(path));//是否可读
            fileContent.setHidden(Files.isHidden(path));//是否是隐藏文件
            fileContent.setOwner(Files.getOwner(path).toString());//文件拥有者
            fileContent.setSize(Files.size(path));//文件大小
            fileContent.setLastAccessTime(//文件最后打开时间
                    df.format(basicFileAttributeView.readAttributes().lastAccessTime().toMillis()));
            fileContent.setLastModifyTime(//文件最后修改时间
                    df.format(basicFileAttributeView.readAttributes().lastModifiedTime().toMillis()));
            fileContent.setCreateTime(//文件创建时间
                    df.format(basicFileAttributeView.readAttributes().creationTime().toMillis()));
            return fileContent;
        }catch (IOException e){
            return null;
        }

    }

    public BaseTask getTask() {
        return task;
    }

    public void setTask(BaseTask task) {
        this.task = task;
    }
}