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

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FPDFSDK_INCLUDE_JAVASCRIPT_JS_VALUE_H_
#define FPDFSDK_INCLUDE_JAVASCRIPT_JS_VALUE_H_

#include "../../../core/include/fxcrt/fx_basic.h"
#include "../jsapi/fxjs_v8.h"

class CJS_Array;
class CJS_Date;
class CJS_Document;
class CJS_Object;

class CJS_Value
{
public:
	CJS_Value(v8::Isolate* isolate);
	CJS_Value(v8::Isolate* isolate, v8::Local<v8::Value> pValue,FXJSVALUETYPE t);
	CJS_Value(v8::Isolate* isolate, const int &iValue);
	CJS_Value(v8::Isolate* isolate, const double &dValue);
	CJS_Value(v8::Isolate* isolate, const float &fValue);
	CJS_Value(v8::Isolate* isolate, const bool &bValue);
	CJS_Value(v8::Isolate* isolate, JSFXObject);
	CJS_Value(v8::Isolate* isolate, CJS_Object*);
   	CJS_Value(v8::Isolate* isolate, CJS_Document*);
	CJS_Value(v8::Isolate* isolate, const FX_CHAR* pStr);
	CJS_Value(v8::Isolate* isolate, const FX_WCHAR* pWstr);
	CJS_Value(v8::Isolate* isolate, CJS_Array& array);

	~CJS_Value();

	void SetNull();
    void Attach(v8::Local<v8::Value> pValue,FXJSVALUETYPE t);
	void Attach(CJS_Value *pValue);
	void Detach();


	int ToInt() const;
	bool ToBool() const;
	double ToDouble() const;
	float  ToFloat() const;
	CJS_Object* ToCJSObject() const;
	CFX_WideString ToCFXWideString() const;
	CFX_ByteString ToCFXByteString() const;
	v8::Local<v8::Object> ToV8Object() const;
	v8::Local<v8::Array> ToV8Array() const;
	v8::Local<v8::Value> ToV8Value() const;

	void operator = (int iValue);
	void operator = (bool bValue);
	void operator = (double);
	void operator = (float);
	void operator = (CJS_Object*);
	void operator = (CJS_Document*);
	void operator = (v8::Local<v8::Object>);
	void operator = (CJS_Array &);
	void operator = (CJS_Date &);
	void operator = (const FX_WCHAR* pWstr);
	void operator = (const FX_CHAR* pStr);
	void operator = (CJS_Value value);

	bool IsArrayObject() const;
	bool	IsDateObject() const;
	FXJSVALUETYPE GetType() const;

	bool ConvertToArray(CJS_Array &) const;
	bool ConvertToDate(CJS_Date &) const;

	v8::Isolate* GetIsolate() {return m_isolate;}
protected:
	v8::Local<v8::Value> m_pValue;
	FXJSVALUETYPE m_eType;
	v8::Isolate* m_isolate;
};

class CJS_Parameters : public CFX_ArrayTemplate<CJS_Value>
{
public:
	void push_back(const CJS_Value& newElement) {
		CFX_ArrayTemplate<CJS_Value>::Add(newElement);
	}
	int size() const {
		return CFX_ArrayTemplate<CJS_Value>::GetSize();
	}
};

class CJS_PropValue: public CJS_Value
{
public:
	CJS_PropValue(const CJS_Value&);
	CJS_PropValue(v8::Isolate* isolate);
	~CJS_PropValue();
public:
	bool IsSetting();
	bool IsGetting();
	void operator<<(int);
	void operator>>(int&) const;
	void operator<<(bool);
	void operator>>(bool&) const;
	void operator<<(double);
	void operator>>(double&) const;
	void operator<<(CJS_Object* pObj);
	void operator>>(CJS_Object*& ppObj) const;
	void operator<<(CJS_Document* pJsDoc);
	void operator>>(CJS_Document*& ppJsDoc) const;
	void operator<<(CFX_ByteString);
	void operator>>(CFX_ByteString&) const;
	void operator<<(CFX_WideString);
	void operator>>(CFX_WideString&) const;
	void operator<<(const FX_WCHAR* c_string);
	void operator<<(JSFXObject);
	void operator>>(JSFXObject&) const;
	void operator>>(CJS_Array& array) const;
	void operator<<(CJS_Array& array);
	void operator<<(CJS_Date& date);
	void operator>>(CJS_Date& date) const;
	operator v8::Local<v8::Value>() const;
	void StartSetting();
	void StartGetting();
private:
	bool m_bIsSetting;
};

class CJS_Array
{
public:
	CJS_Array(v8::Isolate* isolate);
	virtual ~CJS_Array();

	void Attach(v8::Local<v8::Array> pArray);
	void GetElement(unsigned index,CJS_Value &value);
	void SetElement(unsigned index,CJS_Value value);
    int GetLength();
	bool IsAttached();
	operator v8::Local<v8::Array>();

	v8::Isolate* GetIsolate() {return m_isolate;}
private:
	v8::Local<v8::Array> m_pArray;
	v8::Isolate* m_isolate;
};

class CJS_Date
{
friend class CJS_Value;
public:
	CJS_Date(v8::Isolate* isolate);
	CJS_Date(v8::Isolate* isolate,double dMsec_time);
	CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);
	virtual ~CJS_Date();
	void Attach(v8::Local<v8::Value> pDate);

	int     GetYear();
	void    SetYear(int iYear);

	int     GetMonth();
	void    SetMonth(int iMonth);

	int     GetDay();
	void    SetDay(int iDay);

	int     GetHours();
	void    SetHours(int iHours);

	int     GetMinutes();
	void    SetMinutes(int minutes);

	int     GetSeconds();
	void    SetSeconds(int seconds);

	operator v8::Local<v8::Value>();
	operator double() const;

	CFX_WideString	ToString() const;

	static double	MakeDate(int year, int mon, int mday,int hour, int min, int sec,int ms);

	bool	IsValidDate();

protected:
	v8::Local<v8::Value> m_pDate;
	v8::Isolate* m_isolate;
};

#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_VALUE_H_
