import foldertab.FolderTab
import linecounter.LineCounter
import diskusage.DiskUsage
import diff.Diff
import musicplayer.MusicPlayer

/**
 * Basic folder features, which does NOT include features from other components.
 * i.e. This does NOT include "Open Folder", because that is part of FolderTab.
 */
class BasicFolder : SimpleComponent() {

    // ==== Register ====

    override meth register() {

        addFeatures(Context.FOLDER).apply {

            val openTerminal = contextAction( "Terminal", ::openTerminal )
                .icon("terminal").shortcut( Key.T.alt() )
            val browse = contextAction( "Browse", ::browse )
                .icon("browse").shortcut( Key.B.alt() )
            val rename = contextAction( "Rename Folder…", ::rename )
            val copy = contextAction( "Copy Folder…", ::copy )
            val delete = contextAction( "Delete Folder…", ::delete )

            val newFolder = contextAction( "Folder", ::newFolder )
                .shortcut( Key.F.alt() )
            val newEmptyFile = contextAction( "Empty File", ::newEmptyFile )
                .shortcut( Key.N.alt() )
            
            val copyName = contextAction( "Copy Folder Name", ::copyName )
            val copyPath = contextAction( "Copy Folder Path", ::copyPath )

            val newFeatures = MenuFeature( "New", newFolder, newEmptyFile )
            contextMenu(browse, openTerminal, separator, rename, copy, delete, newFeatures, separator,
                copyName, copyPath
            )
            menus(MenuFeature( "Folder", browse, openTerminal, separator, rename, copy, delete, newFeatures ))            
        }
    }
    
    // ==== Actions ====

    func openTerminal( context : Context ) {
        openTerminal( context.value as File )
    }

    func browse( context : Context ) {
        openInExternalApp( context.value as File )
    }

    func rename( context : Context ) {
        RenameFileDialog( context.value as File, null ).show()
    }


    func copy( context : Context ) {
        CopyFileDialog( context.value as File, null ).show()
    }


    func delete( context : Context ) {
        DeleteFileDialog( context.value as File, null ).show()
    }

    func newEmptyFile( context : Context ) {
        val folder = context.value as File
        prompt( "New Empty File", "Create a New Empty File", folder.path, "", ::createEmptyFile.curry( folder ) )
    }

    func newFolder( context : Context ) {
        val parentFolder = context.value as File
        prompt( "New Folder", "Create a Folder", parentFolder.path, "", ::createFolder.curry( parentFolder ) )
    }

    func createEmptyFile( folder : File, name : String ) {
        val newFile = File( folder, name )
        newFile.writeText( "" )
    }

    func createFolder( parentFolder : File, name : String ) {
        val newFolder = File( parentFolder, name )
        newFolder.mkdir()
    }

    func copyName( context : Context ) {
        copyString( (context.value as File).name )
    }
    func copyPath( context : Context ) {
        copyString( (context.value as File).path )
    }
}
