#!/usr/bin/python2.5
#
# Copyright 2010 the Melange authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Starts an interactive shell which allows to create statistic entities.

Usage is simple:

In order to seed all available statistics, just type:
>>> seed_all()

In order to seed one statistic:
>>> seed_one(link_id)
where link_id is for the desired statistic

In order to change program in scope:
>>> set_program(key_name)
where key_name represents a new program

In order to terminate the script:
>>> exit()
"""

__authors__ = [
  '"Daniel Hans" <daniel.m.hans@gmail.com>',
]


import sys
import interactive
interactive.setup()

from django.utils import simplejson

from soc.logic import dicts

from soc.modules.gci.logic.models.program import logic as program_logic

from soc.modules.statistic.logic.models.statistic import logic as \
    statistic_logic

from soc.modules.statistic.models.statistic import Statistic


SUCCESS_MSG_FMT = 'Statistic %s has been sucessfully added.'
FAILURE_MSG_FMT = 'An error occured while adding %s statistic.'
DOES_NOT_EXISTS_MSG_FMT = 'Statistic %s does not exists.'

VISUALIZATION_SETS = {
    "cumulative_standard": [
        "Table",
        "BarChart",
        "ColumnChart",
        "ImageChartBar",
        ],
    "cumulative_countries": [
        "Table"
        ],
    "single_standard": [
        "Table",
        "BarChart",
        "ColumnChart",
        "ImageChartBar",
        "ImageChartP",
        "ImageChartP3",
        "PieChart",
        "ScatterChart"
        ],
      "single_countries": [
          "Table",
          "GeoMap"
          ]
    }

STATISTIC_PROPERTIES = {
    "mentors_per_continent": (
        "Mentors Per Continent",
        {
        "type": "per_field",
        "field": "continent",
        "model": "gci_mentor",
        "subsets": [("all", {}), ("referenced", {}), ("no-referenced", {})],
        "filter": "property_filter",
        "params": {
            "ref_logic": "gci_task",
            "ref_field": "mentors",
            "program_field": "program",
            "property_conditions": {
                "status": ["active", "inactive"]
                 },
            }
        },
        {
        "description": [("continent", "string", "Continent"),
                        ("all_mentors", "number", "Mentors"),
                        ("pro_mentors", "number", "Mentors with tasks"),
                        ("nop_mentors", "number", "Mentors without tasks")],
        "options": {
            'Mentors Per Continent (cumulative)': {
                "visualizations": VISUALIZATION_SETS['cumulative_standard'],
                "columns": [0, 1, 2]
                },
            'Mentors Per Continent (all)': {
                "visualizations": VISUALIZATION_SETS['single_standard'],
                "columns": [0]
                },
            'Mentors Per Continent (with tasks)': {
                "visualizations": VISUALIZATION_SETS['single_standard'],
                "columns": [1]
                },
            'Mentors Per Continent (without tasks)': {
                "visualizations": VISUALIZATION_SETS['single_standard'],
                "columns": [2]
                }
            }
        },
        "org_admin"),
    "students_per_age": (
        "Students Per Age",
        {
        "type": "per_field",
        "field": "age",
        "model": "gci_student",
        "transformer": "remove-out-of-range",
        "filter": "property_filter",
        "params": {
            "program_field": "scope",
            "property_conditions": {
                "status": ['active', 'inactive']
                 },
            }
        },
        {
        "description": [("age", "number", "Age"),
                        ("number", "number", "Number")],
        "options": {
            'Organization Admins Per Age': {
                "visualizations": VISUALIZATION_SETS['single_standard']
                }
            }
        },
        "host"),
}

STATISTICS_LIST = [k for k in STATISTIC_PROPERTIES]
NAMES_DICT = dict((k, v) for k, (v, _, _, _)
    in STATISTIC_PROPERTIES.iteritems())
INSTRUCTIONS_DICT = dict((k, v) for k, (_, v, _, _)
    in STATISTIC_PROPERTIES.iteritems())
CHARTS_DICT = dict((k, v) for k, (_, _, v, _)
    in STATISTIC_PROPERTIES.iteritems())
ACCESS_DICT = dict((k, v) for k, (_, _, _, v)
    in STATISTIC_PROPERTIES.iteritems())


def _getCommonProperties():
  """Returns properties that are common for all statistic entities.
  """

  program = program_logic.getFromKeyName(program_keyname)

  properties = {
      'access_for_other_programs': 'invisible',
      'scope': program,
      'scope_path': program_keyname,
      }

  return properties


def _getSpecificProperties(link_id):
  """Returns properties that are specific to a particular statistic.
  """

  properties = {
      'link_id': link_id,
      'name': NAMES_DICT[link_id],
      'chart_json': simplejson.dumps(CHARTS_DICT[link_id]),
      'instructions_json': simplejson.dumps(INSTRUCTIONS_DICT[link_id]),
      'read_access': ACCESS_DICT[link_id]
      }

  return properties


def _seedStatistic(properties):
  """Saves a new statistic entity, described by properties, in data store.
  """

  entity = statistic_logic.updateOrCreateFromFields(properties, silent=True)

  if entity:
    print SUCCESS_MSG_FMT % properties['link_id']
  else:
    print FALIURE_MSG_FMT % properties['link_id']


def exit():
  """Terminates the script.
  """

  sys.exit(0)


def seedOne(link_id):
  """Seeds a single statistic to the data store.

  Args:
    link_id: link_id of the statistic that should be added.
  """

  if link_id not in STATISTICS_LIST:
    print DOES_NOT_EXISTS_MSG_FMT % link_id
  else:
    properties = _getCommonProperties()
    new_properties = _getSpecificProperties(link_id)
    properties.update(new_properties)
    _seedStatistic(properties)


def seedAll():
  """Seeds all available statistics to the data store.
  """

  properties = _getCommonProperties()

  for statistic in STATISTICS_LIST:

    new_properties = _getSpecificProperties(statistic)
    properties.update(new_properties)
    _seedStatistic(properties)


def setProgram(keyname):
  """Sets program key name.
  """

  program_keyname = keyname


def main(args):

  context = {
      'exit': exit,
      'seed_all': seedAll,
      'seed_one': seedOne,
      'statistics_list': STATISTICS_LIST,
      'set_program': setProgram,
      }

  interactive.remote(args, context)

program_keyname = 'melange/gcirunthrough'

if __name__ == '__main__':
  if len(sys.argv) < 2:
    print "Usage: %s app_id [host]" % (sys.argv[0],)
    sys.exit(1)

  main(sys.argv[1:])
