# -*- coding: utf-8 -*-
"""
Created on Tue Sep 24 13:56:33 2024
@author: sstumvoll
"""
import sys
sys.path.append('OneDrive - Technomics/CDAO/Code/app')
import pandas as pd
from pymongo import MongoClient
#import hvplot.pandas
import pandas as pd
import panel as pn
from app.section_2 import SectionExplorer
import param
from app.overview import Overview
from panel.theme import Theme
from bokeh.themes import CALIBER
#db connection
ATLAS_URI = 'mongodb+srv://sstumvoll:1qaz%21QAZ@cluster0.xfw60.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0'
client = MongoClient(host=ATLAS_URI)
staffing = client.test.staffing
#ui settings
pn.extension("tabulator")
ACCENT = "teal"
styles = {
    "box-shadow": "rgba(50, 50, 93, 0.25) 0px 6px 12px -2px, rgba(0, 0, 0, 0.3) 0px 3px 7px -3px",
    "border-radius": "4px",
    "padding": "10px",
}
class CardTheme(Theme): # generic class
    """
    The DarkTheme provides a dark color palette
    """
    bokeh_theme = param.ClassSelector(class_=(Theme, str), default=CALIBER)
class MaterialCardTheme(CardTheme): # specific class
    # css = param.Filename() Here we could declare some custom CSS to apply
    # This tells Panel to use this implementation
    _template = pn.template.MaterialTemplate
#tab dev
#@pn.cache()
#sections
#section_1 = section_1(styles=styles, document=staffing)
#table_1 = section_1.table_1(staffing)
#table_2 = section_1.table_2(staffing)
#section_1.tab_create(table_1, table_2)
staff_df = pd.DataFrame(list(staffing.find({})))
overview = Overview(data=staff_df)
section_1 = SectionExplorer(data=staff_df)
#search
def get_search():
    return pd.DataFrame(list(staffing.find({})))
def filter_search(text):
    search_data = get_search()
    search_data = search_data[search_data.apply(lambda r: r.str.contains(text).any(), axis=1)]
    search_data = search_data.drop('_id', axis=1)
    return search_data
search = pn.widgets.TextInput(name='', placeholder='Search')
df_search = pn.rx(filter_search)(text=search)
table_search = pn.widgets.Tabulator(df_search, sizing_mode="stretch_both", name="Search")
column_search = pn.Column(table_search, 
                          styles=styles, 
                          sizing_mode="stretch_width", 
                          height=500, 
                          margin=10)
#column_search.append(section_1)
#sidbar dev
jos_pages = {
    "Overview":  pn.Column("# JOS Roles", overview),
    "Roles": pn.Column("# JOS Roles", section_1),
    "Program": pn.Column("# Program", section_1),
    "Milestone": pn.Column("# Milestone", section_1),
    "Acquisition": pn.Column("# Acquisition", section_1),
    "Software": pn.Column("# Software", section_1),
    "Business Processes": pn.Column("# Business Processes", section_1),
    "Manpower": pn.Column("# Manpower", section_1),
    "Search": pn.Column("# JOS  Search", search, pn.layout.Divider(), column_search)
}
dil_pages = {
    "Overview":  pn.Column("# JOS Roles", overview),
    "Milestone": pn.Column("# Milestone", section_1),
    "Roles": pn.Column("# Data Integration Layer Roles", section_1),
    "Program": pn.Column("# Program", section_1),
    "Acquisition": pn.Column("# Acquisition", section_1),
    "Software": pn.Column("# Software", section_1),
    "Business Processes": pn.Column("# Business Processes", section_1),
    "Manpower": pn.Column("# Manpower", section_1),
    "Search": pn.Column("# DIL Search", search, pn.layout.Divider(), column_search)
}
#header menu
menu_items = [
    ('Joint Operating Systems', 'jos'), 
    ('Data Integration Layer', 'dil'), 
    ('Global Information Dominance Experiment', 'gide'), 
    ('Mission Command Applications', 'mca')]
menu_button = pn.widgets.MenuButton(
    name='Program Selection', 
    items=menu_items, 
    button_type='light',
    button_style='outline',
    width = 400)
class pageBuilder():
    def __init__(self):
      self.pages =  jos_pages
      
    
    def program_selector(self,event):
        p = f'"{event.new}"'
        if p == '"jos"':
            self.pages = jos_pages
            print(p)
        else:
            self.pages = dil_pages
            print('else')
    
def c(event):
    p = f'"{event.new}"'
    if p == '"jos"':
        program_text.value = 'Joint Operating Systems'
        pb.pages = jos_pages
        section.options = list(pb.pages.keys())
    elif p == '"dil"':
        program_text.value = 'Data Integration Layer'
        pb.pages = dil_pages
        section.options = list(pb.pages.keys())
    elif p == '"gide"':
        program_text.value = 'Global Information Dominance Experiment'
        pb.pages = jos_pages
        section.options = list(pb.pages.keys())
    else:
        program_text.value = 'Mission Command Applications'
        pb.pages = dil_pages
        section.options = list(pb.pages.keys())
pb = pageBuilder()
program_text = pn.widgets.StaticText(
    value='Joint Operating Systems',
    stylesheets=[':host {color: white; font-size: 200%}']
    )
menu_button.on_click(c)
def show(page, user, password):
    pw = "password!"
    u = 'user'
    if (password == pw) & (user == u):
        content = pb.pages[page]
    else: content = pn.Column(user_input, password_input, signin)
        #content = open('login.html', 'r', encoding='utf-8').read()
    return content
starting_page = pn.state.session_args.get("page", [b"Overview"])[0].decode()
section = pn.widgets.RadioButtonGroup(
    value=starting_page,
    options=list(pb.pages.keys()),
    name="Section",
    sizing_mode="fixed",
    button_type="primary",
    orientation='vertical',
    width=300,
    height=400
)
       
    
#main
def main():
    #pn.state.location.sync(page, {"value": "page"})
    
    
    template = pn.template.MaterialTemplate(
        title="Cost Analysis Requirements Document (CARD)",
        header=pn.Row(program_text, menu_button, height=200, width=400),
        sidebar=[section],
        main=[ishow],
        #main_layout='card',
       # accent=ACCENT,
    ).servable()
    return template
    
user_input = pn.widgets.TextInput(name="User Name:", placeholder="user")
password_input = pn.widgets.TextInput(name="Password:", placeholder="password")
#password_input.param.watch(check_password, 'value')
signin = pn.widgets.Button(name='Sign in', button_type='primary')
def x(event):
   password_input.value = password_input.value +'!'
signin.on_click(x)
ishow = pn.bind(show, page=section, user=user_input.param.value, password=password_input.param.value)
main_app = main()
#main_app.main.objects = [pshow]
#main_app.visible = False
#main_app.servable() 
#app = pn.serve(main_app,
#         threaded=True
#         )
main_app