from __future__ import unicode_literals

import frappe, sys
import erpnext
import frappe.utils
from erpnext.demo.setup_data import setup_data
from erpnext.demo.user import hr, sales

def make(domain='Manufacturing'):
	frappe.flags.domain = domain
	setup_data()
	simulate()

def simulate():
	runs_for = frappe.flags.runs_for or 150
	frappe.flags.company = erpnext.get_default_company()

	if not frappe.flags.start_date:
		# start date = 100 days back
		frappe.flags.start_date = frappe.utils.add_days(frappe.utils.nowdate(), -1 * runs_for)

	current_date = frappe.utils.getdate(frappe.flags.start_date)

	# continue?
	demo_last_date = frappe.db.get_global('demo_last_date')
	if demo_last_date:
		current_date = frappe.utils.add_days(demo_last_date, 1)

	# run till today
	if not runs_for:
		runs_for = frappe.utils.date_diff(frappe.utils.nowdate(), current_date)
		# runs_for = 100

	for i in xrange(runs_for):
		sys.stdout.write("\rSimulating {0}".format(current_date.strftime("%Y-%m-%d")))
		sys.stdout.flush()
		frappe.flags.current_date = current_date

		if current_date.weekday() in (5, 6):
			current_date = frappe.utils.add_days(current_date, 1)
			continue

		hr.work()
		sales.work()
		# run_purchase()
		# run_manufacturing()
		# run_stock()
		# run_accounts()
		# run_projects()
		# run_messages()

		current_date = frappe.utils.add_days(current_date, 1)

		frappe.db.commit()
