package com.dounine.japi.core.impl;

import com.dounine.japi.common.JapiPattern;
import com.dounine.japi.core.IAction;
import com.dounine.japi.core.IPackage;
import com.dounine.japi.exception.JapiException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;

/**
 * Created by huanghuanlai on 2017/1/18.
 */
public class PackageImpl implements IPackage {

    private File packageFold;

    @Override
    public List<IAction> getActions() {
        final IOFileFilter dirFilter = FileFilterUtils.asFileFilter(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".java") && !pathname.getName().equals("package-info.java");
            }
        });
        Collection<File> actionFiles = FileUtils.listFiles(packageFold, dirFilter, null);
        List<IAction> actions = new ArrayList<>();
        for (File actionFile : actionFiles) {
            ActionImpl action = new ActionImpl();
            action.setActionFile(actionFile);
            actions.add(action);
        }
        return actions;
    }

    @Override
    public String getName() {
        try {
            final IOFileFilter dirFilter = FileFilterUtils.asFileFilter(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.getName().equals("package-info.java");
                }
            });
            Collection<File> actionFiles = FileUtils.listFiles(packageFold, dirFilter, null);
            if(actionFiles.size()==1){
                List<String> javaLines = FileUtils.readLines(actionFiles.iterator().next(), Charset.forName("utf-8"));
                Pattern docBeginPattern = JapiPattern.getPattern("[/][*][*]");
                Pattern classBeginPattern = JapiPattern.getPattern("[a-zA-Z0-9_]+\\s*[{]$");
                List<String> docsAndAnnos = new ArrayList<>();
                boolean docBegin = false;
                boolean classBegin = false;
                for (String line : javaLines) {
                    if (false == docBegin && docBeginPattern.matcher(line).find()) {
                        docBegin = true;
                    }
                    if (docBegin && !classBegin) {
                        docsAndAnnos.add(line);
                    }
                    if(classBeginPattern.matcher(line).find()){
                        classBegin = true;
                        break;
                    }
                }
                if(docsAndAnnos.size()>0){
                    Pattern docEndPattern = JapiPattern.getPattern("[*][/]$");
                    List<String> docs = new ArrayList<>();
                    for(String line : docsAndAnnos){
                        docs.add(line);
                        if(docEndPattern.matcher(line).find()){
                            break;
                        }
                    }
                    String name = "";
                    for(String line : docs){
                        if(line.length()>3){
                            name = line.substring(3).trim();
                            break;
                        }
                    }
                    if(name.contains("/")||name.contains(" ")||name.contains(",")){
                        throw new JapiException("包名注释[ "+name+" ] 不能有特殊符号['/',' ',',']");
                    }
                    return name;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public File getPackageFold() {
        return packageFold;
    }

    public void setPackageFold(File packageFold) {
        this.packageFold = packageFold;
    }

}