from django.db import models
from codereview.browser import vcs

class Repository(models.Model):
    name = models.CharField(max_length=200, unique=True)
    path = models.CharField(max_length=255)
    type = models.IntegerField(default=0)

    class Meta:
        permissions = (
            ("browse", "Browse repositories"),
        )

    def update(self):
        repo = vcs.create(self.type, self.path)
        branches = repo.branches()
        for branch, commit in branches.iteritems():
            try:
                head = Head.objects.get(repository=self, name=branch)
            except:
                head = Head(repository=self, name=branch)
            try:
                c = Commit.objects.get(repository=self, ref=commit.id)
            except:
                c = Commit(repository=self, ref=commit.id)
            c.load(repo)
            head.commit = c
            head.save()
    def __unicode__(self):
        return self.name

class Commit(models.Model):
    ref = models.CharField(max_length=40)
    repository = models.ForeignKey(Repository)
    message = models.TextField()
    author = models.CharField(max_length=255)
    author_email = models.CharField(max_length=255)
    committer = models.CharField(max_length=255)
    committer_email = models.CharField(max_length=255)
    authored_date = models.DateTimeField()
    committed_date = models.DateTimeField()
    parents = models.ManyToManyField('self')

    def load(self, repo):
        commit = repo.commit(self.ref)
        self.message = commit.message
        self.author = commit.author
        self.author_email = commit.author_email
        self.committer = commit.committer
        self.committer_email = commit.committer_email
        self.authored_date = commit.authored_date
        self.committed_date = commit.committed_date
        self.save()
        for parent in commit.parents:
            try:
                p = Commit.objects.get(ref=parent, repository=self.repository)
            except:
                p = Commit(ref=parent, repository=self.repository)
                p.load(repo)
            self.parents.add(p)
        self.save()
    def __unicode__(self):
        return self.ref

class Head(models.Model):
    repository = models.ForeignKey(Repository)
    commit = models.ForeignKey(Commit)
    name = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name