/*
 * Copyright (C) 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.googlecode.android_scripting.facade.media;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaScanner;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;

import com.googlecode.android_scripting.Log;
import com.googlecode.android_scripting.facade.EventFacade;
import com.googlecode.android_scripting.facade.FacadeManager;
import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
import com.googlecode.android_scripting.rpc.Rpc;
import com.googlecode.android_scripting.rpc.RpcParameter;

/**
 * Expose functionalities of MediaScanner related APIs.
 */
public class MediaScannerFacade extends RpcReceiver {

    private final Service mService;
    private final MediaScanner mScanService;
    private final EventFacade mEventFacade;
    private final MediaScannerReceiver mReceiver;

    public MediaScannerFacade(FacadeManager manager) {
        super(manager);
        mService = manager.getService();
        mScanService = new MediaScanner(mService);
        mEventFacade = manager.getReceiver(EventFacade.class);
        mReceiver = new MediaScannerReceiver();
    }

    public class MediaScannerReceiver extends BroadcastReceiver {  

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
                Log.d("Scan finished, posting event.");
                mEventFacade.postEvent("MediaScanFinished", new Bundle());
                mService.unregisterReceiver(mReceiver);
            } 
        }
    }

    @Rpc(description = "Scan external storage for media files.")
    public void mediaScanForFiles() {
        mService.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                               Uri.parse("file://" + Environment.getExternalStorageDirectory())));
        mService.registerReceiver(mReceiver,
                                  new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED));
    }

    @Rpc(description = "Scan for a media file.")
    public void mediaScanForOneFile(@RpcParameter(name = "path") String path) {
        mService.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(path)));
    }

    @Override
    public void shutdown() {
    }
}
