#!/usr/bin/env python2.3

import sys
import os.path
sys.path.append("./../")
import Bookmark
import Category
import PageData
import BookmarkContainer
from cStringIO import StringIO
import pdb
import csv

class CSVStorage:
    bookmark_file = 'bookmarks.csv'
    menu_file = 'menu.csv'
    id_val = 0
    def __init__(self, prepath='./'):
        self.bookmark_file = os.path.join(prepath, self.bookmark_file)
        self.menu_file = os.path.join(prepath, self.menu_file)
        self._load_data(prepath)

    def _load_data(self, prepath='./'):
        # load bookmarks
        self.bookmarks, self.menu = [], []
        csv_reader = csv.reader(file(self.bookmark_file, 'r'))
        keywords = ['category','url','id','name','page_url']
        for row in csv_reader:
            # csv file is in the format category,url,id,name,page_url
            kwargs = dict(zip(keywords, row))
            self.bookmarks.append(Bookmark.Bookmark(**kwargs))

        csv_reader = csv.reader(file(self.menu_file, 'r'))      
        keywords = ['id','name','page_url']
        for row in csv_reader:
            # csv file is in the format category,url,id,name,page_url
            kwargs = dict(zip(keywords, row))
            self.menu.append(Bookmark.Bookmark(**kwargs))

        # find highest id number and save it so we can generate unique id's
        for bm in self.bookmarks:
            if bm.id > self.id_val:
                self.id_val = int(bm.id)
        

    def _flush_data(self):
        # write the bookmark data
        fd = file(self.bookmark_file, 'w')
        writer = csv.writer(fd)
        for bm in self.bookmarks:
            writer.writerow(bm.csv_row)
        del(writer)
        fd.close()

        fd = file(self.menu_file, 'w')
        writer = csv.writer(fd)
        for bm in self.menu:
            writer.writerow(bm.csv_row)
        del(writer)
        fd.close()


    def get_PageData(self, page_url='/home'):
        return PageData.PageData(categories=self._get_Category_list_for_page(page_url), page_url=page_url)
    
    def _get_Category_list_for_page(self, page_url='/home'):
        '''returns a list of Category objects for the specified page_url'''
        cat_name_list = self._get_category_names(page_url=page_url)
        cat_list = []
        for cat_name in cat_name_list:
            bookmark_list = self.get_Bookmarks(category=cat_name)
            cat_list.append(Category.Category(bookmarks=bookmark_list, 
                            page_url=page_url, name=cat_name))
        return cat_list


    def _get_category_names(self, page_url='/home'):
        # gets all category names for a given page and removes duplicates
        result = []
        for bm in self.bookmarks:
            if bm.page_url == page_url and bm.category not in result:
                result.append(bm.category)
        return result

    def get_Category_combobox_data(self, page_url='/home'):
        return self._get_category_names(page_url)

    def get_MenuData(self):
        return BookmarkContainer.BookmarkContainer(bookmarks=self.menu)

    def get_EditPageData(self):
        return BookmarkContainer.BookmarkContainer(self.bookmarks)

    def delete_Bookmark(self, bookmark):
        try:
            self.bookmarks.remove(bookmark)
        except Exception, e:
            pdb.set_trace() 
        self._flush_data()
        self._load_data()

    def update_Bookmark(self, bookmark):
        # this is a pretty awful function. it searches every bookmark
        # but it is simple and effective for this example
        # it would probably be more efficient to implement a dictionary/index of 
        # id values
        for index, bm in enumerate(self.bookmarks):
            if bm.id == bookmark.id:
                self.bookmarks[index] = bookmark
        self._flush_data()
        self._load_data()

    def add_Bookmark(self, bookmark):
        self.id_val += 1
        bookmark.id = str(self.id_val)
        self.bookmarks.append(bookmark)
        self._flush_data()
        self._load_data()

    def get_Bookmarks(self,  **kwargs):
        result = []
        for bm in self.bookmarks: 
            if bm.matches_values(**kwargs):
                result.append(bm)

        if len(result) == 1:
            return result[0]
        return result
 

if __name__ == "__main__":
    c = CSVStorage()





syntax highlighted by Code2HTML, v. 0.9.1