#!/usr/bin/python
# -*- coding: utf-8 -*-

import argparse
import copy
import datetime
import json
import os
import subprocess
import tempfile

description = u'''
Отредактировать состояние user-action-log-writer (без автоматического обновления, только подготовить строчку для вставку в таблицу с состоянием).
В новой строчке автоматически прибавит секунду к datetime.

edit-alw-state --source ppc:21 --type LOG
edit-alw-state --source ppc:21 --type DICT

'''
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=description)
parser.add_argument('--source', required=True)
parser.add_argument('--type', required=True)
parser.add_argument('--state-table', required=False, default='user_action_log2.user_action_log_state')
args = parser.parse_args()
source = args.source
state_type = args.type.upper()
state_table = args.state_table

p = subprocess.Popen(['clickhouse-client', '-q', "SELECT * FROM {} WHERE source = '{}' AND type = '{}' ORDER BY datetime DESC LIMIT 1 FORMAT JSONEachRow".format(state_table, source, state_type)], stdout=subprocess.PIPE)
state_row = json.load(p.stdout)
p.wait()
print state_row['datetime']

state_time = datetime.datetime.strptime(state_row['datetime'], '%Y-%m-%d %H:%M:%S')

(fd, new_state_path) = tempfile.mkstemp(prefix="alw-new-state-")
f = os.fdopen(fd, 'w')
state = json.loads(state_row['state'])
json.dump(state, f, indent=4, sort_keys=True)
f.close()
subprocess.check_call(['vim', new_state_path])

f = open(new_state_path, 'r')
new_state = json.loads(f.read())
new_state_time = state_time + datetime.timedelta(0, 1)	# 1 sec
                                                        # в 00:00:00 date и datetime разъедутся
new_state_row = copy.deepcopy(state_row)
new_state_row['state'] = json.dumps(new_state)
new_state_row['datetime'] = new_state_time.strftime('%Y-%m-%d %H:%M:%S')
fd, new_data_path = tempfile.mkstemp(prefix="alw-data-")
f = os.fdopen(fd, 'w')
json.dump(new_state_row, f)
f.close()

os.remove(new_state_path)

print 'new data dumped to ' + new_data_path
print 'to load to Clickhouse, run'
print '  clickhouse-client -q "INSERT INTO {} FORMAT JSONEachRow" < {}'.format(state_table, new_data_path)
