# Copyright (c) 2017, Frappe and Contributors
# License: GNU General Public License v3. See license.txt

from __future__ import unicode_literals

from datetime import datetime

import frappe
from frappe.utils import getdate

from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import (
	DuplicateAssignment,
)


def execute():
	frappe.reload_doc('Payroll', 'doctype', 'Salary Structure')
	frappe.reload_doc("Payroll", "doctype", "Salary Structure Assignment")
	frappe.db.sql("""
		delete from `tabSalary Structure Assignment`
		where salary_structure in (select name from `tabSalary Structure` where is_active='No' or docstatus!=1)
	""")
	if frappe.db.table_exists('Salary Structure Employee'):
		ss_details = frappe.db.sql("""
			select sse.employee, sse.employee_name, sse.from_date, sse.to_date,
				sse.base, sse.variable, sse.parent as salary_structure, ss.company
			from `tabSalary Structure Employee` sse, `tabSalary Structure` ss
			where ss.name = sse.parent AND ss.is_active='Yes'
			AND sse.employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')""", as_dict=1)
	else:
		cols = ""
		if "base" in frappe.db.get_table_columns("Salary Structure"):
			cols = ", base, variable"

		ss_details = frappe.db.sql("""
			select name as salary_structure, employee, employee_name, from_date, to_date, company {0}
			from `tabSalary Structure`
			where is_active='Yes'
			AND employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')
		""".format(cols), as_dict=1)

	all_companies = frappe.db.get_all("Company", fields=["name", "default_currency"])
	for d in all_companies:
		company = d.name
		company_currency = d.default_currency

		frappe.db.sql("""update `tabSalary Structure` set currency = %s where company=%s""", (company_currency, company))

	for d in ss_details:
		try:
			joining_date, relieving_date = frappe.db.get_value("Employee", d.employee,
				["date_of_joining", "relieving_date"])
			from_date = d.from_date
			if joining_date and getdate(from_date) < joining_date:
				from_date = joining_date
			elif relieving_date and getdate(from_date) > relieving_date:
				continue
			company_currency = frappe.db.get_value('Company', d.company, 'default_currency')

			s = frappe.new_doc("Salary Structure Assignment")
			s.employee = d.employee
			s.employee_name = d.employee_name
			s.salary_structure = d.salary_structure
			s.from_date = from_date
			s.to_date = d.to_date if isinstance(d.to_date, datetime) else None
			s.base = d.get("base")
			s.variable = d.get("variable")
			s.company = d.company
			s.currency = company_currency

			# to migrate the data of the old employees
			s.flags.old_employee = True
			s.save()
			s.submit()
		except DuplicateAssignment:
			pass

	frappe.db.sql("update `tabSalary Structure` set docstatus=1")
