// Copyright 2016 The Tulsi Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import Foundation

// Set of UTIs used by Xcode in project files. These can be extracted from *.pbfilespec specs within
// the Xcode bundle.
let FileExtensionToUTI = [
  "1": "text.man",
  "C": "sourcecode.cpp.cpp",
  "H": "sourcecode.cpp.h",
  "M": "sourcecode.cpp.objcpp",
  "a": "archive.ar",
  "ada": "sourcecode.ada",
  "adb": "sourcecode.ada",
  "ads": "sourcecode.ada",
  "aiff": "audio.aiff",
  "api": "text.woapi",
  "app": "wrapper.application",
  "asdictionary": "archive.asdictionary",
  "asm": "sourcecode.asm.asm",
  "au": "audio.au",
  "avi": "video.avi",
  "bin": "archive.macbinary",
  "bmp": "image.bmp",
  "bundle": "wrapper.plug-in",
  "bzl": "com.google.bazel.skylark",
  "c": "sourcecode.c.c",
  "c++": "sourcecode.cpp.cpp",
  "cc": "sourcecode.cpp.cpp",
  "cdda": "audio.aiff",
  "ci": "sourcecode.glsl",
  "cikernel": "sourcecode.glsl",
  "cl": "sourcecode.opencl",
  "class": "compiled.javaclass",
  "classdescription": "text.plist.ibClassDescription",
  "classdescriptions": "text.plist.ibClassDescription",
  "cp": "sourcecode.cpp.cpp",
  "cpp": "sourcecode.cpp.cpp",
  "csh": "text.script.csh",
  "css": "text.css",
  "cxx": "sourcecode.cpp.cpp",
  "d": "sourcecode.dtrace",
  "d2wmodel": "text.plist.d2wmodel",
  "dSYM": "wrapper.dsym",
  "defs": "sourcecode.mig",
  "dict": "text.plist",
  "dsym": "wrapper.dsym",
  "dtd": "text.xml",
  "dylan": "sourcecode.dylan",
  "dylib": "compiled.mach-o.dylib",
  "ear": "archive.ear",
  "exp": "sourcecode.exports",
  "f": "sourcecode.fortran",
  "f77": "sourcecode.fortran.f77",
  "f90": "sourcecode.fortran.f90",
  "f95": "sourcecode.fortran.f90",
  "for": "sourcecode.fortran",
  "frag": "sourcecode.glsl",
  "framework": "wrapper.framework",
  "fsh": "sourcecode.glsl",
  "gif": "image.gif",
  "gmk": "sourcecode.make",
  "gz": "archive.gzip",
  "h": "sourcecode.c.h",
  "h++": "sourcecode.cpp.h",
  "hh": "sourcecode.cpp.h",
  "hp": "sourcecode.cpp.h",
  "hpp": "sourcecode.cpp.h",
  "hqx": "archive.binhex",
  "htm": "text.html",
  "html": "text.html",
  "htmld": "wrapper.htmld",
  "hxx": "sourcecode.cpp.h",
  "i": "sourcecode.c.c.preprocessed",
  "icns": "image.icns",
  "ico": "image.ico",
  "ii": "sourcecode.cpp.cpp.preprocessed",
  "inc": "sourcecode.pascal",
  "jam": "sourcecode.jam",
  "jar": "archive.jar",
  "java": "sourcecode.java",
  "javascript": "sourcecode.javascript",
  "jobs": "sourcecode.jobs",
  "jpeg": "image.jpeg",
  "jpg": "image.jpeg",
  "js": "sourcecode.javascript",
  "jscript": "sourcecode.javascript",
  "jsp": "text.html.other",
  "kext": "wrapper.kernel-extension",
  "l": "sourcecode.lex",
  "lid": "sourcecode.dylan",
  "ll": "sourcecode.asm.llvm",
  "llx": "sourcecode.asm.llvm",
  "lm": "sourcecode.lex",
  "lmm": "sourcecode.lex",
  "lp": "sourcecode.lex",
  "lpp": "sourcecode.lex",
  "lxx": "sourcecode.lex",
  "m": "sourcecode.c.objc",
  "mak": "sourcecode.make",
  "mi": "sourcecode.c.objc.preprocessed",
  "mid": "audio.midi",
  "midi": "audio.midi",
  "mig": "sourcecode.mig",
  "mii": "sourcecode.cpp.objcpp.preprocessed",
  "mm": "sourcecode.cpp.objcpp",
  "moov": "video.quicktime",
  "mov": "video.quicktime",
  "mp3": "audio.mp3",
  "mpeg": "video.mpeg",
  "mpg": "video.mpeg",
  "mpkg": "wrapper.installer-mpkg",
  "nasm": "sourcecode.nasm",
  "nib": "wrapper.nib",
  "nib~": "wrapper.nib",
  "nqc": "sourcecode.nqc",
  "o": "compiled.mach-o.objfile",
  "p": "sourcecode.pascal",
  "pas": "sourcecode.pascal",
  "pbfilespec": "text.plist.pbfilespec",
  "pblangspec": "text.plist.pblangspec",
  "pbxproj": "text.pbxproject",
  "pch": "sourcecode.c.h",
  "pch++": "sourcecode.cpp.h",
  "pct": "image.pict",
  "pdf": "image.pdf",
  "perl": "text.script.perl",
  "php": "text.script.php",
  "php3": "text.script.php",
  "php4": "text.script.php",
  "phtml": "text.script.php",
  "pict": "image.pict",
  "pkg": "wrapper.installer-pkg",
  "pl": "text.script.perl",
  "playground": "file.playground",
  "plist": "text.plist",
  "pm": "text.script.perl",
  "png": "image.png",
  "pp": "sourcecode.pascal",
  "ppob": "archive.ppob",
  "py": "text.script.python",
  "qtz": "video.quartz-composer",
  "r": "sourcecode.rez",
  "rb": "text.script.ruby",
  "rbw": "text.script.ruby",
  "rcx": "compiled.rcx",
  "rez": "sourcecode.rez",
  "rhtml": "text.html.other",
  "rsrc": "archive.rsrc",
  "rtf": "text.rtf",
  "rtfd": "wrapper.rtfd",
  "s": "sourcecode.asm",
  "scriptSuite": "text.plist.scriptSuite",
  "scriptTerminology": "text.plist.scriptTerminology",
  "sh": "text.script.sh",
  "shtml": "text.html.other",
  "sit": "archive.stuffit",
  "storyboard": "file.storyboard",
  "storyboardc": "wrapper.storyboardc",
  "strings": "text.plist.strings",
  "swift": "sourcecode.swift",
  "tar": "archive.tar",
  "tcc": "sourcecode.cpp.cpp",
  "tif": "image.tiff",
  "tiff": "image.tiff",
  "txt": "text",
  "vert": "sourcecode.glsl",
  "view": "archive.rsrc",
  "vsh": "sourcecode.glsl",
  "war": "archive.war",
  "wav": "audio.wav",
  "woa": "wrapper.application.webobjects",
  "wod": "text.wodefinitions",
  "woo": "text.plist.woobjects",
  "worksheet": "text.script.worksheet",
  "wos": "sourcecode.webscript",
  "xcclassmodel": "wrapper.xcclassmodel",
  "xcconfig": "text.xcconfig",
  "xcdatamodel": "wrapper.xcdatamodel",
  "xcdatamodeld": "wrapper.xcdatamodeld",
  "xclangspec": "text.plist.xclangspec",
  "xcmappingmodel": "wrapper.xcmappingmodel",
  "xcode": "wrapper.pb-project",
  "xcodeproj": "wrapper.pb-project",
  "xconf": "text.xml",
  "xcplaygroundpage": "file.xcplaygroundpage",
  "xcspec": "text.plist.xcspec",
  "xcsynspec": "text.plist.xcsynspec",
  "xctarget": "wrapper.pb-target",
  "xctxtmacro": "text.plist.xctxtmacro",
  "xhtml": "text.xml",
  "xib": "file.xib",
  "xmap": "text.xml",
  "xml": "text.xml",
  "xsl": "text.xml",
  "xslt": "text.xml",
  "xsp": "text.xml",
  "y": "sourcecode.yacc",
  "ym": "sourcecode.yacc",
  "ymm": "sourcecode.yacc",
  "yp": "sourcecode.yacc",
  "ypp": "sourcecode.yacc",
  "yxx": "sourcecode.yacc",
  "zip": "archive.zip",
]

// Set of UTIs used by Xcode for source or target bundle directories in project files.
// Note that entries here may be duplicative with the FileExtensionToUTI dictionary above.
let DirExtensionToUTI = [
  "app": "wrapper.application",
  "appex": "wrapper.app-extension",
  "bundle": "wrapper.plug-in",
  "framework": "wrapper.framework",
  "octest": "wrapper.cfbundle",
  "xcassets": "folder.assetcatalog",
  "xcodeproj": "wrapper.pb-project",
  "xcdatamodel": "wrapper.xcdatamodel",
  "xcdatamodeld": "wrapper.xcdatamodeld",
  "xcmappingmodel": "wrapper.xcmappingmodel",
  "xctest": "wrapper.cfbundle",
  "xcstickers": "folder.stickers",
  "xpc": "wrapper.xpc-service",
]

// Helper methods to extract filename-like substrings from strings.
extension String {
  var pbPathExtension: String? {
    let ext = (self as NSString).pathExtension
    if ext.isEmpty {
      return nil
    }
    return ext
  }

  var pbPathUTI: String? {
    guard let ext = pbPathExtension else {
      return nil
    }
    let lcaseExt = ext.lowercased()
    if let uti = FileExtensionToUTI[lcaseExt] {
      return uti
    }
    if let uti = DirExtensionToUTI[lcaseExt] {
      return uti
    }

    // Fall back to the system UTI if there's no Xcode-specific override.
    guard let unmanaged = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, ext as CFString, nil) else {
      return nil
    }
    let managed = unmanaged.takeRetainedValue()
    return managed as String
  }

  var pbPathLastComponent: String {
    return (self as NSString).lastPathComponent
  }
}
