package com.simplemobiletools.filemanager.dialogs

import android.app.Dialog
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.support.v7.app.AlertDialog
import android.text.format.DateFormat
import android.view.View
import com.simplemobiletools.filemanager.Config
import com.simplemobiletools.filemanager.R
import com.simplemobiletools.filemanager.extensions.formatSize
import com.simplemobiletools.filepicker.models.FileDirItem
import kotlinx.android.synthetic.main.item_properties.view.*
import java.io.File
import java.util.*

class PropertiesDialog : DialogFragment() {
    companion object {
        lateinit var mItem: FileDirItem
        private var mFilesCnt: Int = 0
        private var mShowHidden: Boolean = false

        fun newInstance(item: FileDirItem): PropertiesDialog {
            mItem = item
            mFilesCnt = 0
            return PropertiesDialog()
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val title = if (mItem.isDirectory) R.string.directory_properties else R.string.file_properties
        val infoView = activity.layoutInflater.inflate(R.layout.item_properties, null)

        infoView.apply {
            properties_name.text = mItem.name
            properties_path.text = mItem.path
            properties_size.text = getItemSize()

            if (mItem.isDirectory) {
                properties_files_count_label.visibility = View.VISIBLE
                properties_files_count.visibility = View.VISIBLE
                properties_files_count.text = mFilesCnt.toString()
            }

            val file = File(mItem.path)
            properties_last_modified.text = formatLastModified(file.lastModified())
        }

        return AlertDialog.Builder(context)
            .setTitle(resources.getString(title))
            .setView(infoView)
            .setPositiveButton(R.string.ok, null)
            .create()
    }

    fun getItemSize(): String {
        if (mItem.isDirectory) {
            mShowHidden = Config.newInstance(context).showHidden
            return getDirectorySize(File(mItem.path)).formatSize()
        }

        return mItem.size.formatSize()
    }

    private fun formatLastModified(ts: Long): String {
        val cal = Calendar.getInstance(Locale.ENGLISH)
        cal.timeInMillis = ts
        return DateFormat.format("dd/MM/yyyy HH:mm", cal).toString()
    }

    private fun getDirectorySize(dir: File): Long {
        if (dir.exists()) {
            var size: Long = 0
            val files = dir.listFiles()
            for (i in files.indices) {
                if (files[i].isDirectory) {
                    size += getDirectorySize(files[i])
                } else {
                    size += files[i].length()
                    if (!files[i].isHidden && !dir.isHidden || mShowHidden)
                        mFilesCnt++
                }
            }
            return size
        }
        return 0
    }
}