# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt

from __future__ import unicode_literals
import frappe
from frappe import _, throw
from frappe.utils import flt
from frappe.utils import get_datetime, get_datetime_str

def get_company_currency(company):
    currency = frappe.db.get_value("Company", company, "default_currency", cache=True)
    if not currency:
        currency = frappe.db.get_default("currency")
    if not currency:
        throw(_('Please specify Default Currency in Company Master and Global Defaults'))

    return currency

def get_root_of(doctype):
    """Get root element of a DocType with a tree structure"""
    result = frappe.db.sql_list("""select name from `tab%s`
        where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
        (doctype, doctype))
    return result[0] if result else None

def get_ancestors_of(doctype, name):
    """Get ancestor elements of a DocType with a tree structure"""
    lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"])
    result = frappe.db.sql_list("""select name from `tab%s`
        where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
    return result or []

def before_tests():
    frappe.clear_cache()
    # complete setup if missing
    from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
    if not frappe.get_list("Company"):
        setup_complete({
            "currency"            :"USD",
            "first_name"        :"Test",
            "last_name"            :"User",
            "company_name"        :"Wind Power LLC",
            "timezone"            :"America/New_York",
            "company_abbr"        :"WP",
            "industry"            :"Manufacturing",
            "country"            :"United States",
            "fy_start_date"        :"2011-01-01",
            "fy_end_date"        :"2011-12-31",
            "language"            :"english",
            "company_tagline"    :"Testing",
            "email"                :"test@erpnext.com",
            "password"            :"test",
            "chart_of_accounts" : "Standard",
            "domain"            : "Manufacturing",
            
        })

    frappe.db.sql("delete from `tabLeave Allocation`")
    frappe.db.sql("delete from `tabLeave Application`")
    frappe.db.sql("delete from `tabSalary Slip`")
    frappe.db.sql("delete from `tabItem Price`")

    frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 0)

    frappe.db.commit()

@frappe.whitelist()
def get_exchange_rate(translation_date, from_currency, to_currency):
    if not (translation_date and from_currency and to_currency):
        # manqala 19/09/2016: Should this be an empty return or should it throw and exception?
        return
    
    if from_currency == to_currency:
        return 1
    
    # cksgb 19/09/2016: get all entries in Currency Exchange with from_currency and to_currency. Order by date desc. Top one is the required exchange rate
    entries = frappe.get_all("Currency Exchange", fields = ["*"], filters=[["date", "<=", get_datetime_str(translation_date)], ["from_currency", "=", from_currency], ["to_currency", "=", to_currency]], order_by="date desc")
    if entries:
        return flt(entries[0].exchange_rate)

    try:
        cache = frappe.cache()
        key = "currency_exchange_rate:{0}:{1}".format(from_currency, to_currency)
        value = cache.get(key)

        if not value:
            import requests
            response = requests.get("http://api.fixer.io/latest", params={
                "base": from_currency,
                "symbols": to_currency
            })
            # expire in 6 hours
            response.raise_for_status()
            value = response.json()["rates"][to_currency]
            cache.setex(key, value, 6 * 60 * 60)

        return flt(value)
    except:
        frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}").format(from_currency, to_currency, translation_date))
        return 0.0