#!/usr/bin/ensim-python

import sys
import getopt
from string import replace
from string import split
from string import join
from vh3 import virthost

# HELPERS

DEBUG=0
SLOUTPUTS=['domain','wp_user','site_handle','site_root','site_admin']

def usage():
    sys.stderr.write("usage: sitelookup [ -w <wp_user> ] [ -s <site_handle> ] [ -d <domain> ]\n")
    sys.stderr.write("                  [ -u <site_admin> ] [ -a ]\n")
    sys.stderr.write("                  [ %s ]\n\n"%join(SLOUTPUTS,','))
    sys.stderr.write("                  -w:wp_user is the top level unix user (admin1)\n")
    sys.stderr.write("                  -s:site_handle is the site equivalent of wp_user (site1)\n")
    sys.stderr.write("                  -d:domain is the hostname for a site (myco.com)\n")
    sys.stderr.write("                  -u:site_admin is the username for a site (bob)\n")
    sys.stderr.write("                  -a:returns info on all sites\n")

def format_outputs(outputs, dict):
    content = ''
    count = len(outputs)
    for output in outputs:
        count=count-1
        if output in SLOUTPUTS:
            if dict.has_key(output):
                content = content + dict[output]
            else:
                content = content + 'N/A'
                print_err(3,output)
        else:
            print_err(0,'output',output)
        if count!=0:
            content = content + ','
    print content

def build_dict(domain=None,wp_user=None,site_handle=None,site_admin=None):
    dict = {}
    dict['domain']=domain
    dict['wp_user']=wp_user
    dict['site_handle']=site_handle
    dict['site_root']=virthost.domain_path(dict['domain'])
    dict['site_admin']=site_admin
    return dict

def load_siteinfo(site):
    siteinfo, errs = virthost.read_conf_file(site,'siteinfo')
    #TODO:XXX:erro handling needed
    if siteinfo is None:
        print 'error: could not load configuration for %s'%site
        return None
    else:
        return siteinfo

def print_err(errno,item,value=None):
    if errno==0:
        sys.stderr.write("error: unknown %s: %s\n"%(item,value))
    elif errno==1:
        sys.stderr.write("error: %s %s does not exist\n"%(item,value))
    elif errno==2:
        sys.stderr.write("error: %s %s lookup failed\n"%(item,value))
    elif errno==3:
        sys.stderr.write("error: could not find %s\n"%(item))
    else:
        sys.stderr.write("error: unknown error (%s,%s)\n"%(item,value))

# MAIN

try:
    inputs, outputs = getopt.getopt(sys.argv[1:], 'w:s:d:u:a')
except getopt.GetoptError:
    usage()
    sys.exit(1)

# no input or too much output give usage
if len(inputs) == 0 or len(outputs) > 1:
    usage()
    sys.exit(1)

# no output, output everything
if len(outputs) == 0:
    outputs = SLOUTPUTS
else:
    outputs = split(outputs[0],',')

if DEBUG:
    print inputs
    print outputs

if ('-a','') in inputs:
    # return all
    for site in virthost.get_domain_list():
        siteinfo = load_siteinfo(site)
        if siteinfo is not None:
            dict=build_dict(siteinfo['domain'],siteinfo['admin'],site,siteinfo['admin_user'])
            format_outputs(outputs,dict)
else:
    # do inputs
    for inp,val in inputs:
        if DEBUG:
            print inp,val
        # by wp_user (admin<n>)
        if inp == '-w':
            admin=val
            # replace admin with site and do what site does
            site=replace(admin,'admin','site')
            # validate site
            sitelist = virthost.get_domain_list()
            if site not in sitelist:
                print_err(1,'wp_user',admin)
                break
            siteinfo = load_siteinfo(site)
            if siteinfo is None:
                print_err(2,'wp_user',admin)
                break
            dict=build_dict(siteinfo['domain'],siteinfo['admin'],site,siteinfo['admin_user'])
            format_outputs(outputs, dict)

        # by site_handle (site<n>)
        elif inp == '-s':
            site=val
            # validate 'site'
            sitelist = virthost.get_domain_list()
            if site not in sitelist:
                print_err(1,'site_handle',site)
                break
            siteinfo = load_siteinfo(site)
            if siteinfo is None:
                print_err(2,'site_handle',site)
                break
            dict=build_dict(siteinfo['domain'],siteinfo['admin'],site,siteinfo['admin_user'])
            format_outputs(outputs, dict)

        # by domain (myco.com)
        elif inp == '-d':
            domain=val
            # get site from domain
            site=virthost.get_site_from_domain(domain)
            # validate site
            sitelist = virthost.get_domain_list()
            if site not in sitelist:
                print_err(1,'domain',domain)
                break
            siteinfo = load_siteinfo(site)
            if siteinfo is None:
                print_err(2,'domain',domain)
                break
            dict=build_dict(siteinfo['domain'],siteinfo['admin'],site,siteinfo['admin_user'])
            format_outputs(outputs, dict)

        # by site_admin (mycoadmin)
        elif inp == '-u':
            site_admin = val
            # brute force this one, just cycle through sites
            found = 0
            for potential_site in virthost.get_domain_list():
                siteinfo = load_siteinfo(potential_site)
                if siteinfo is not None and siteinfo['admin_user'] == site_admin:
                    found = 1
                    site = potential_site
                    dict=build_dict(siteinfo['domain'],siteinfo['admin'],site,siteinfo['admin_user'])
                    format_outputs(outputs, dict)
            if not found:
                print_err(2,'site_admin',site_admin)
                break

        # unknown (ignore)
        else:
            print_err(0,'input','%s %s'%(inp,val))

sys.exit(0)
