package com.printer.demo.utils;

import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;

import com.printer.sdk.utils.XLog;

import java.io.BufferedReader;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class UriUtils {
   /**
    * 专为Android4.4设计的从Uri获取文件绝对路径，以前的方法已不好使
    */
   @SuppressLint("NewApi")
   public static String getPath(final Context context, final Uri uri) {
      final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

      // DocumentProvider
      if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
         // ExternalStorageProvider
         if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
               return Environment.getExternalStorageDirectory() + "/" + split[1];
            }
         }
         // DownloadsProvider
         else if (isDownloadsDocument(uri)) {

            final String id = DocumentsContract.getDocumentId(uri);
            final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

            return getDataColumn(context, contentUri, null, null);
         }
         // MediaProvider
         else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];
            XLog.d("yxz",uri.toString());
            XLog.d("yxz","type:"+type);
            Uri contentUri = null;
            if ("image".equals(type)) {
             //  contentUri = Madia.Images.Media.EXTERNAL_CONTENT_URI;
               contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
               contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
               contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }else if ("document".equals(type)) {
               contentUri=MediaStore.Files.getContentUri("external");
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[]{split[1]};
            XLog.d("yxz","contentUri:"+contentUri+",selection:"+selection+",selectionArgs:"+selectionArgs);
            return getDataColumn(context, contentUri, selection, selectionArgs);
         }
      }
      // MediaStore (and general)
      else if ("content".equalsIgnoreCase(uri.getScheme())) {
         return getDataColumn(context, uri, null, null);
      }
      // File
      else if ("file".equalsIgnoreCase(uri.getScheme())) {
         return uri.getPath();
      }
      return null;
   }
   /**
    * Get the value of the data column for this Uri. This is useful for
    * MediaStore Uris, and other file-based ContentProviders.
    *
    * @param context       The context.
    * @param uri           The Uri to query.
    * @param selection     (Optional) Filter used in the query.
    * @param selectionArgs (Optional) Selection arguments used in the query.
    * @return The value of the _data column, which is typically a file path.
    */
   public static String getDataColumn(Context context, Uri uri, String selection,
                                      String[] selectionArgs) {

      Cursor cursor = null;
      final String column = "_data";
      final String[] projection = {column};

      try {
         cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                 null);
         if (cursor != null && cursor.moveToFirst()) {
            final int column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
         }
      } finally {
         if (cursor != null)
            cursor.close();
      }
      return null;
   }

   /**
    * @param uri The Uri to check.
    * @return Whether the Uri authority is ExternalStorageProvider.
    */
   public static boolean isExternalStorageDocument(Uri uri) {
      return "com.android.externalstorage.documents".equals(uri.getAuthority());
   }

   /**
    * @param uri The Uri to check.
    * @return Whether the Uri authority is DownloadsProvider.
    */
   public static boolean isDownloadsDocument(Uri uri) {
      return "com.android.providers.downloads.documents".equals(uri.getAuthority());
   }

   /**
    * @param uri The Uri to check.
    * @return Whether the Uri authority is MediaProvider.
    */
   public static boolean isMediaDocument(Uri uri) {
      return "com.android.providers.media.documents".equals(uri.getAuthority());
   }




   private  void getContentResolverInfo(Context context,Uri uri) {
      Cursor cursor = null;
      long   start  = System.currentTimeMillis();

      try {
         cursor = context.getContentResolver().query(uri, null, null, null, null);

         if (cursor != null && cursor.moveToFirst()) {
            String fileName = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
            long   fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(OpenableColumns.SIZE));
            long   filePath = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) );

            ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri,"rw");
            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
            String keystoreContent = readFileContent(fileDescriptor);

            FileInputStream fileInputStream = new FileInputStream(fileDescriptor);

            String mimeType = context.getContentResolver().getType(uri);

         }
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         if (cursor != null)
            cursor.close();
      }
   }

   public static String readFileContent( FileDescriptor fileDescriptor) {
      Log.i("", "readFileContent(), fileDescriptor=" + fileDescriptor);
      if(fileDescriptor == null) {
         return null;
      }
      FileInputStream fileInputStream = null;
      try {
         fileInputStream = new FileInputStream(fileDescriptor);
      } catch (Exception e) {
         e.printStackTrace();
         return null;
      }
      InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.defaultCharset());
      BufferedReader reader = new BufferedReader(inputStreamReader);
      StringBuffer sb = new StringBuffer("");
      String line;
      try {
         while ((line = reader.readLine()) != null) {
            sb.append(line);
            sb.append("\n");
         }
      } catch (IOException e) {
         e.printStackTrace();
         return null;
      } finally {
         try {
            reader.close();
            inputStreamReader.close();
            fileInputStream.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
      return sb.toString();
   }

}
