/**
 * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
 * This file is part of CSipSimple.
 *
 *  CSipSimple is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  If you own a pjsip commercial license you can also redistribute it
 *  and/or modify it under the terms of the GNU Lesser General Public License
 *  as an android library.
 *
 *  CSipSimple is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with CSipSimple.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.voiceblue.phone.utils.video;

import android.content.Context;
import android.text.TextUtils;

import com.voiceblue.phone.utils.Compatibility;
import com.voiceblue.phone.utils.Log;

import java.util.ArrayList;
import java.util.List;

public abstract class VideoUtilsWrapper {
    private static VideoUtilsWrapper instance;

    private static final String THIS_FILE = "VideoUtilsWrapper";

    public class VideoCaptureDeviceInfo {
        public List<VideoCaptureCapability> capabilities;
        public VideoCaptureCapability bestCapability;

        public VideoCaptureDeviceInfo() {
            capabilities = new ArrayList<VideoCaptureCapability>();
        }
    }

    public static class VideoCaptureCapability {
        public int width;
        public int height;
        public int fps;

        public VideoCaptureCapability() {

        }

        public VideoCaptureCapability(String preferenceValue) {
            if (!TextUtils.isEmpty(preferenceValue)) {
                String[] size_fps = preferenceValue.split("@");
                if (size_fps.length == 2) {
                    String[] width_height = size_fps[0].split("x");
                    if (width_height.length == 2) {
                        try {
                            width = Integer.parseInt(width_height[0]);
                            height = Integer.parseInt(width_height[1]);
                            fps = Integer.parseInt(size_fps[1]);
                        } catch (NumberFormatException e) {
                            Log.e(THIS_FILE, "Cannot parse the preference for video capture cap");
                        }
                    }
                }
            }
        }

        public String toPreferenceValue() {
            return (width + "x" + height + "@" + fps);
        }

        public String toPreferenceDisplay() {
            return (width + " x " + height + " @" + fps + "fps");
        }
    }

    public static VideoUtilsWrapper getInstance() {
        if (instance == null) {
            if (Compatibility.isCompatible(5)) {
                instance = new com.voiceblue.phone.utils.video.VideoUtils5();
            } else {
                instance = new com.voiceblue.phone.utils.video.VideoUtils3();
            }
        }

        return instance;
    }

    protected VideoUtilsWrapper() {
        // By default nothing to do in constructor
    }

    public abstract List<VideoCaptureDeviceInfo> getVideoCaptureDevices(Context ctxt);

}
