#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import shutil
import sys
from pkg_resources import resource_filename

from migrate.versioning.base import *
from migrate.versioning import pathed


class Packaged(pathed.Pathed):
    """An object assoc'ed with a Python package"""

    def __init__(self, pkg):
        self.pkg = pkg
        path = self._find_path(pkg)
        super(Packaged, self).__init__(path)

    @classmethod
    def _find_path(cls, pkg):
        pkg_name, resource_name = pkg.rsplit('.', 1)
        ret = resource_filename(pkg_name, resource_name)
        return ret

class Collection(Packaged):
    """A collection of templates of a specific type"""

    _default = None

    def get_path(self, file):
        return os.path.join(self.path, str(file))

    def get_pkg(self, file):
        return (self.pkg, str(file))

class RepositoryCollection(Collection):
    _default = 'default'

class ScriptCollection(Collection):
    _default = 'default.py_tmpl'

class Template(Packaged):
    """Finds the paths/packages of various Migrate templates"""

    _repository = 'repository'
    _script = 'script'
    _manage = 'manage.py_tmpl'

    def __init__(self, pkg):
        super(Template, self).__init__(pkg)
        self.repository=RepositoryCollection('.'.join((self.pkg, self._repository)))
        self.script=ScriptCollection('.'.join((self.pkg, self._script)))

    def get_item(self, attr, filename=None, as_pkg=None, as_str=None):
        item = getattr(self, attr)
        if filename is None:
            filename = getattr(item, '_default')
        if as_pkg:
            ret = item.get_pkg(filename)
            if as_str:
                ret = '.'.join(ret)
        else:
            ret = item.get_path(filename)
        return ret

    def get_repository(self, filename=None, as_pkg=None, as_str=None):
        return self.get_item('repository', filename, as_pkg, as_str)
    
    def get_script(self, filename=None, as_pkg=None, as_str=None):
        return self.get_item('script', filename, as_pkg, as_str)

    def manage(self, **k):
        return (self.pkg, self._manage)

template_pkg = 'migrate.versioning.templates'
template = Template(template_pkg)