package ProjectData.Files;
import Common.Constants;
import Common.Database.DBObject;
import Common.Utils.Utils;
import ProjectData.LanguageName;

import javax.swing.*;
import java.io.File;
import java.net.URL;
//возможно, в дальнейшем унаследовать от него DBProjectFile, но пока лучше не трогать то что работает.
public class ProjectFile extends DBObject {
    public File file = null; //собственно, файл на который ссылаемся.
    public FileType fileType = FileType.none;
    public LanguageName languageName = LanguageName.n;
    public LanguageStyle style = LanguageStyle.none;
    public FileState state = FileState.Undefined; //состояние файла.
    public ProjectFile() {
    }
    public ProjectFile(File file_in) {
        file = file_in;
        AutoDetectProperties();
    }
    @Override
    public Object getPK() {
        return file.getName();
    }
    public void AutoDetectProperties() {
        AutoDetectProperties(file.getName());
    }
    public void AutoDetectProperties(String name_in) {
        //проверка запретных имен.
        String[] forbiddenNames = new String[]{
                Constants.INTERRUPT,
                Constants.launch_script_name,
                Constants.default_binary_name,
                //--
                Constants.DONE,
                Constants.TIMEOUT,
                Constants.out_file,
                Constants.err_file,
                Constants.time_file,
                "Makefile"
        };
        for (String forbidden : forbiddenNames) {
            if (name_in.equalsIgnoreCase(forbidden)) {
                fileType = FileType.forbidden;
                return;
            }
        }
        //-
        switch (Utils.getExtensionByName(name_in)) {
            case "f":
            case "fdv":
            case "for":
            case "f77":
                fileType = FileType.program;
                languageName = LanguageName.fortran;
                style = LanguageStyle.fixed;
                break;
            case "f90":
                fileType = FileType.program;
                languageName = LanguageName.fortran;
                style = LanguageStyle.free;
                break;
            case "c":
            case "cdv":
                fileType = FileType.program;
                languageName = LanguageName.c;
                break;
            case "cpp":
                fileType = FileType.program;
                languageName = LanguageName.cpp;
                break;
            case "h":
                fileType = FileType.header;
                break;
            case "fh":
                fileType = FileType.header;
                languageName = LanguageName.fortran;
                break;
            case "o":
            case "gcda":
            case "gcno":
            case "gcov":
            case "exe":
            case "pdf":
                fileType = FileType.forbidden;
                break;
            case "":
                if (Utils.isDigit(name_in)) {
                    fileType = FileType.forbidden;
                } else {
                    state = FileState.Excluded;
                    fileType = FileType.none;
                    languageName = LanguageName.n;
                }
                break;
            default:
                //все остальное считаем исключенными из рассмотрения.
                //если юзеру надо сам их разблочит.
                state = FileState.Excluded;
                fileType = FileType.none;
                languageName = LanguageName.n;
                break;
        }
    }
    public String ImageKey() {
        //icons/files/Excludeddata.png
        String pref = "/icons/files/";
        String body;
        switch (fileType) {
            case program:
                body = state.toString() + languageName.toString();
                break;
            case data:
                body = "Undefined"; // иных состояний у данных не бывает. ситуация возникает если по ошибке поменяли тип
                //нормальных файлов с сообщениями на дату.
                break;
            default:
                body = state.toString();
                break;
        }
        return pref + body + fileType + ".png";
    }
    public ImageIcon GetIcon() {
        URL imageUrl = getClass().getResource(ImageKey());
        if (imageUrl == null) {
            System.out.println(ImageKey() + "not found");
        }
        return new ImageIcon(imageUrl);
    }
    public String getUnixName() {
        return Utils.toU(file.getName());
    }
    @Override
    public String toString() {
        return file.getName();
    }
    public String getQSourceName() {
        return Utils.DQuotes(getUnixName());
    }
    public String getStyleOptions() {
        if (languageName == LanguageName.fortran) {
            switch (style) {
                case fixed:
                case extended:
                    return "-FI";
                case free:
                    return "-f90";
                case none:
                    break;
            }
        }
        return "";
    }
    public boolean isNotExcludedProgram() {
        return fileType.equals(FileType.program) && !languageName.equals(LanguageName.n) && !state.equals(FileState.Excluded);
    }
}
