// Copyright 2013 The Flutter 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.flutter.util;

import android.content.Context;
import android.os.Build;
import androidx.annotation.NonNull;
import java.io.File;

public final class PathUtils {
  @NonNull
  public static String getFilesDir(@NonNull Context applicationContext) {
    File filesDir = applicationContext.getFilesDir();
    if (filesDir == null) {
      filesDir = new File(getDataDirPath(applicationContext), "files");
    }
    return filesDir.getPath();
  }

  @NonNull
  public static String getDataDirectory(@NonNull Context applicationContext) {
    final String name = "flutter";
    File flutterDir = applicationContext.getDir(name, Context.MODE_PRIVATE);
    if (flutterDir == null) {
      flutterDir = new File(getDataDirPath(applicationContext), "app_" + name);
    }
    return flutterDir.getPath();
  }

  @NonNull
  public static String getCacheDirectory(@NonNull Context applicationContext) {
    File cacheDir;
    if (Build.VERSION.SDK_INT >= 21) {
      cacheDir = applicationContext.getCodeCacheDir();
      if (cacheDir == null) {
        cacheDir = applicationContext.getCacheDir();
      }
    } else {
      cacheDir = applicationContext.getCacheDir();
    }
    if (cacheDir == null) {
      // This can happen if the disk is full. This code path is used to set up dart:io's
      // `Directory.systemTemp`. It's unknown if the application will ever try to
      // use that or not, so do not throw here. In this case, this directory does
      // not exist because the disk is full, and the application will later get an
      // exception when it tries to actually write.
      cacheDir = new File(getDataDirPath(applicationContext), "cache");
    }
    return cacheDir.getPath();
  }

  private static String getDataDirPath(Context applicationContext) {
    if (Build.VERSION.SDK_INT >= 24) {
      return applicationContext.getDataDir().getPath();
    } else {
      return applicationContext.getApplicationInfo().dataDir;
    }
  }
}
