#
# Collective Knowledge (indexing through ElasticSearch)
#
# See CK LICENSE.txt for licensing details
# See CK COPYRIGHT.txt for copyright details
#
# Developer: Grigori Fursin
#

cfg={}  # Will be updated by CK (meta description of this module)
work={} # Will be updated by CK (temporal data)
ck=None # Will be updated by CK (initialized CK kernel) 

# Local settings

##############################################################################
# Initialize module

def init(i):
    """

    Input:  {}

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
            }

    """
    return {'return':0}

##############################################################################
# turn indexing on

def on(i):
    """

    Input:  {}

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
            }

    """

    o=i.get('out','')

    i['status']='yes'

    r=status(i)
    if r['return']>0: return r

    if o=='con':
       ck.out('Indexing is on')

    return {'return':0}

##############################################################################
# turn indexing off

def off(i):
    """

    Input:  {}

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
            }

    """

    o=i.get('out','')

    i['status']='no'

    r=status(i)
    if r['return']>0: return r

    if o=='con':
       ck.out('Indexing is off')

    return {'return':0}

##############################################################################
# show indexing status

def show(i):
    """

    Input:  {}

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
            }

    """

    o=i.get('out','')

    i['status']=''

    r=status(i)
    if r['return']>0: return r

    s=r['status']
    if s=='yes': sx='on'
    else: sx='off'

    if o=='con':
       ck.out('Indexing status: '+sx)

    return {'return':0}

##############################################################################
# check indexing status

def status(i):
    """

    Input:  {
               status - if 'yes', turn it on 
                        if 'no', turn it off 
                        if '', return status
            }

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
              status
            }

    """

    # Get current configuration
    cfg={}

    r=ck.access({'action':'load',
                 'repo_uoa':ck.cfg['repo_name_default'],
                 'module_uoa':ck.cfg['subdir_kernel'],
                 'data_uoa':ck.cfg['subdir_kernel_default']})
    if r['return']==0: 
       cfg.update(r['dict'])

    r=ck.access({'action':'load',
                 'repo_uoa':ck.cfg['repo_name_local'],
                 'module_uoa':ck.cfg['subdir_kernel'],
                 'data_uoa':ck.cfg['subdir_kernel_default']})
    if r['return']>0:
       if r['return']!=16: return r

       ck.out('')
       ck.out('We strongly suggest you to setup local repository first!')
       return {'return':0}

    cfg.update(r['dict'])

    # Turn on indexing
    st=i.get('status','')
    s=cfg.get('use_indexing',ck.cfg.get('use_indexing',''))

    if st!='':
       cfg['use_indexing']=st
       s=st

    r=ck.access({'action':'update',
                 'repo_uoa':ck.cfg['repo_name_local'],
                 'module_uoa':ck.cfg['subdir_kernel'],
                 'data_uoa':ck.cfg['subdir_kernel_default'],
                 'dict':cfg,
                 'substitute':'yes',
                 'ignore_update':'yes'})
    if r['return']>0: return r

    return {'return':0, 'status':s}

##############################################################################
# check indexing status

def test(i):
    """

    Input:  {
            }

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
            }

    """

    o=i.get('out','')

    r=ck.access_index_server({'request':'TEST', 'dict':{}})
    if r['return']>0: return r
    dd=r['dict']

    status=dd.get('status',0)
    if status!=200:
       return {'return':1, 'error':'returned status is not 200'}

    version=dd.get('version',{}).get('number','')

    if o=='con':
       ck.out('Indexing server is working. Version = '+version+'.')

    return r

##############################################################################
# clean whole index

def clean(i):
    """

    Input:  {
              (force)  - if 'yes', force cleaning
            }

    Output: {
              return       - return code =  0, if successful
                                         >  0, if error
              (error)      - error text if return > 0
            }

    """

    o=i.get('out','')

    to_delete=True
    if o=='con' and i.get('force','')!='yes':
       r=ck.inp({'text':'Are you sure to clean the whole index (y/N): '})
       c=r['string'].lower()
       if c!='y' and c!='yes': to_delete=False

    if to_delete:
       r=ck.access_index_server({'request':'DELETE', 'path':'/_all', 'dict':{}})
       if r['return']>0: return r
       dd=r['dict']

       status=dd.get('status',0)
       err=dd.get('error','')

       if err!='': r={'return':1, 'error':err}

    return r
