// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.android.apps.reader;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.content.ContextCompat;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.Executor;

/**
 * Utility class which contains useful static methods.
 */
public class Utils {

    /**
     * Checks if the app has read and write permission to the external storage.
     */
    public static boolean hasExternalStoragePermission(Context context) {
        boolean hasWritePermission = ContextCompat.checkSelfPermission(context,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
        boolean hasReadPermission = ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;

        return hasWritePermission && hasReadPermission;
    }

    /**
     * Returns an app-independent files directory for saving log files, to avoid accidentally
     * deleting log files by clearing the app data.
     */
    public static File getLogDirectory() {
        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        return dir;
    }

    /**
     * Returns the current time as string formatted as "yyyyMMdd-HHmmss.SSS",
     * which can be used in log filenames.
     */
    public static String getTimeString() {
        SimpleDateFormat formatter = new SimpleDateFormat(
                "yyyyMMdd-HHmmss.SSS", Locale.getDefault());
        return formatter.format(new Date());
    }

    /**
     * Returns an {@link Executor} which runs the provided task in the main thread.
     */
    public static MainThreadExecutor mainThreadExecutor() {
        return new MainThreadExecutor();
    }

    private static class MainThreadExecutor implements Executor {
        private final Handler mHandler = new Handler(Looper.getMainLooper());

        @Override
        public void execute(Runnable command) {
            mHandler.post(command);
        }
    }

}
