from django.db import models
from django.db.models import JSONField
from django.contrib.auth.models import User as DjangoAuthUser
from django.utils import timezone
from datetime import timedelta

class AdminMenuGroup(models.Model):
    code=models.CharField(max_length=10)
    name=models.CharField(max_length=50)
    description=models.CharField(max_length=200,null=True,blank=True)
    ENABLE='1'
    DISABLE='0'
    STATUS=(
        (DISABLE,'Disable'),
        (ENABLE,'Enable'),
    )
    status=models.CharField(max_length=20,choices=STATUS,default=ENABLE)
    date=models.DateTimeField(auto_created=True,auto_now=True)
    
    def __str__(self):
	    return self.name  

class AdminMenuSubGroup(models.Model):
    menugpcode=models.CharField(max_length=50)
    code=models.CharField(max_length=50)
    name=models.CharField(max_length=100)
    namespace=models.CharField(max_length=255)
    icons=models.CharField(max_length=150)
    DISABLE='0'
    ENABLE='1'
    STATUS=(
        (DISABLE,'Disable'),
        (ENABLE,'Enable') 
    )
    status=models.CharField(max_length=20,choices=STATUS,default=ENABLE)
    date=models.DateTimeField(auto_created=True,auto_now=True)    
    def __str__(self):
        return self.name

class AdminMenuSubGroupDetail(models.Model):
    menugpcode=models.CharField(max_length=50,blank=True,null=True)
    menucatcode=models.CharField(max_length=50,blank=True,null=True)
    code=models.CharField(max_length=50,blank=True,null=True)
    icons=models.CharField(max_length=150,blank=True,null=True)
    name=models.CharField(max_length=100,blank=True,null=True)
    namespace=models.CharField(max_length=255,blank=True,null=True)
    imageuniname=models.CharField(max_length=150,blank=True,null=True)
    STATUS=(
        ('0','Disable'),
        ('1','Enable')
    )
    status=models.CharField(max_length=20,choices=STATUS,default='1')
    NCI=(
        ('0','No notification icon'),
        ('1','Notification icon'),
    )
    notification=models.CharField(max_length=20,choices=NCI,default='0')
    SB=(
        ('0','Off'),
        ('1','On'),
    )
    sidebar=models.CharField(max_length=20,choices=SB,default='1')
    dashboard=models.CharField(max_length=20,choices=SB,default='1')
    windview=models.CharField(max_length=20,choices=SB,default='0')
    windviewgeneralreport=models.CharField(max_length=20,choices=SB,null=True,blank=True)
    windviewfinancialreport=models.CharField(max_length=20,choices=SB,null=True,blank=True)
    windviewstatisticalreport=models.CharField(max_length=20,choices=SB,null=True,blank=True)
    ACR=(
        ('1','General User'),
        ('2','Administrator Access Right.'),
    )
    admin_accessright=models.CharField(max_length=250,choices=ACR,default='1')
    date=models.DateTimeField(auto_created=True,auto_now=True)
    targeted=models.CharField(max_length=255,null=True,blank=True)
    viewer=models.CharField(max_length=255,null=True,blank=True)

    def __str__(self):
        return self.name

class AdminMenuSubUsers(models.Model):
    usruserid=models.CharField(max_length=50)
    menudetcode=models.CharField(max_length=50,null=True,blank=True)
    STATUS=(
        ('0','Revoked'),
        ('1','Granted'),
    ) 
    status=models.CharField(max_length=50,choices=STATUS,default='1')
    addedby=models.CharField(max_length=50,null=True,blank=True)
    date=models.DateTimeField(auto_now=True,auto_created=True)

    def __str__(self):
        return self.usruserid+' '+self.menudetcode


class AdminRoles(models.Model):
    code = models.CharField(max_length=50, unique=True)
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True, default='')
    STATUS = (('0', 'Inactive'), ('1', 'Active'))
    status = models.CharField(max_length=5, choices=STATUS, default='1')
    date = models.DateTimeField(auto_now=True, auto_created=True)

    def __str__(self):
        return self.name


class AdminRoleMenus(models.Model):
    usruserid = models.CharField(max_length=50)   # role code
    menudetcode = models.CharField(max_length=50, null=True, blank=True)
    STATUS = (('0', 'Revoked'), ('1', 'Granted'))
    status = models.CharField(max_length=50, choices=STATUS, default='1')
    addedby = models.CharField(max_length=50, null=True, blank=True)
    date = models.DateTimeField(auto_now=True, auto_created=True)

    def __str__(self):
        return self.usruserid + ' ' + (self.menudetcode or '')


class AdminPositions(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True, default='')
    STATUS = (('0', 'Inactive'), ('1', 'Active'))
    status = models.CharField(max_length=5, choices=STATUS, default='1')
    date = models.DateTimeField(auto_now=True, auto_created=True)

    def __str__(self):
        return self.name


class AdminEventLog(models.Model):
    evtcode=models.CharField(max_length=100)
    memid=models.CharField(max_length=100)
    name=models.CharField(max_length=180)
    activities=models.CharField(max_length=600)
    evtdate = models.DateTimeField(auto_now=True, auto_created=True)
    ip=models.CharField(max_length=50)
    session_id=models.CharField(max_length=200)
    browser=models.CharField(max_length=300)

    def __str__(self):
        return f'{self.evtcode} - {self.activities}'

class AdminEventType(models.Model):
    code=models.CharField(max_length=50)
    name=models.CharField(max_length=200)

    def __str__(self):
        return f'{self.code} - {self.name} '

class AdminUsers(models.Model):
    code=models.CharField(max_length=50, unique=True)
    surname=models.CharField(max_length=100)
    othernames=models.CharField(max_length=100)
    password=models.CharField(max_length=400)
    username=models.CharField(max_length=50, unique=True)
    startdate=models.DateField(auto_now=True,auto_created=True)
    emergencyphone=models.CharField(max_length=255,null=True,blank=True)
    phoneno=models.CharField(max_length=100,null=True,blank=True)
    LEVEL=(
        ('1','administrator'),
        ('2','operator'),
        ('3','Manager'),
    )
    level=models.IntegerField(default=1)
    PWDCHANGESTATE=(
        ('0','Disabled'),
        ('1','Enabled')
    )
    passwordchange = models.CharField(max_length=50,choices=PWDCHANGESTATE,default='0')
    organisationcode = models.CharField(max_length=50, blank=True, default='')
    organisationname = models.CharField(max_length=150, blank=True, default='')
    regioncode = models.CharField(max_length=100, blank=True,default='')
    regionname = models.CharField(max_length=100, blank=True,default='')
    districtcode = models.CharField(max_length=100, blank=True,default='')
    districtname = models.CharField(max_length=100, blank=True,default='')
    position = models.CharField(max_length=100, blank=True,default='')
    email=models.CharField(max_length=255,null=True,blank=True)
    STATUS=(
        ('-1','Deleted'),
        ('0','Disabled'),
        ('1','Enabled'),
    )
    status=models.CharField(max_length=50,choices=STATUS,default='1')
    role_code = models.CharField(max_length=50, blank=True, default='')
    actorid=models.CharField(max_length=50,null=True,blank=True)
    actorname = models.CharField(max_length=150, blank=True, default='')
    type = models.CharField(max_length=50, blank=True,default='')
    date=models.DateTimeField(auto_now=True,auto_created=True)

    def __str__(self):
        return self.surname+' '+ self.othernames

class AdminUserPermission(models.Model):
    usruserid=models.CharField(max_length=50)
    menudetcode=models.CharField(max_length=50,null=True,blank=True)
    STATUS=(
        ('0','Revoked'),
        ('1','Granted'),
    ) 
    status=models.CharField(max_length=50,choices=STATUS,default='1')
    addedby=models.CharField(max_length=50,null=True,blank=True)
    date=models.DateTimeField(auto_now=True,auto_created=True)

    def __str__(self):
        return self.usruserid+' '+self.menudetcode


# ─────────────────────────────────────────────
#  CONTENT MODELS (FILMS/TV)
# ─────────────────────────────────────────────

class Genre(models.Model):
    name = models.CharField(max_length=100, unique=True)
    description = models.TextField(blank=True)
    slug = models.SlugField(unique=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class Movie(models.Model):
    RATING_CHOICES = [
        ('G', 'General Audience'),
        ('PG', 'Parental Guidance'),
        ('PG-13', 'Parents Strongly Cautioned'),
        ('R', 'Restricted'),
        ('NC-17', 'No One 17 and Under'),
    ]

    title = models.CharField(max_length=200)
    description = models.TextField(blank=True, default='')
    release_date = models.DateField(blank=True, null=True)
    duration = models.PositiveIntegerField(help_text='Duration in minutes', blank=True, null=True)
    poster = models.ImageField(upload_to='posters/', blank=True, null=True)
    backdrop = models.ImageField(upload_to='backdrops/', blank=True, null=True)
    trailer_file = models.FileField(upload_to='videos/trailers/', blank=True, null=True)
    video_file = models.FileField(upload_to='videos/', blank=True, null=True)
    rating = models.CharField(max_length=10, choices=RATING_CHOICES, default='PG')
    genres = models.ManyToManyField(Genre, related_name='movies', blank=True)
    director = models.CharField(max_length=200, blank=True)
    cast = models.TextField(blank=True, help_text='Comma-separated list of actors')
    imdb_rating = models.DecimalField(max_digits=3, decimal_places=1, blank=True, null=True)
    rotten_tomatoes_score = models.PositiveIntegerField(blank=True, null=True)
    is_featured = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    views_count = models.PositiveIntegerField(default=0)
    likes_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    TRANSCODING_STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('processing', 'Processing'),
        ('completed', 'Completed'),
        ('failed', 'Failed'),
    ]
    transcoding_status = models.CharField(max_length=20, choices=TRANSCODING_STATUS_CHOICES, default='completed')
    optimized_video = models.FileField(upload_to='videos/optimized/', blank=True, null=True)
    hls_playlist = models.FileField(upload_to='videos/hls/', blank=True, null=True)

    def __str__(self):
        return self.title


class TVShow(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True, default='')
    release_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)
    poster = models.ImageField(upload_to='tv_posters/', blank=True, null=True)
    trailer_url = models.URLField(blank=True)
    genres = models.ManyToManyField(Genre, related_name='tv_shows', blank=True)
    creator = models.CharField(max_length=200, blank=True)
    cast = models.TextField(blank=True, help_text='Comma-separated list of actors')
    imdb_rating = models.DecimalField(max_digits=3, decimal_places=1, blank=True, null=True)
    rotten_tomatoes_score = models.PositiveIntegerField(blank=True, null=True)
    seasons_count = models.PositiveIntegerField(default=1)
    episodes_count = models.PositiveIntegerField(default=1)
    is_featured = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_ongoing = models.BooleanField(default=True)
    views_count = models.PositiveIntegerField(default=0)
    likes_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title


class Episode(models.Model):
    tv_show = models.ForeignKey(TVShow, on_delete=models.CASCADE, related_name='episodes')
    season_number = models.PositiveIntegerField()
    episode_number = models.PositiveIntegerField()
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    duration = models.PositiveIntegerField(help_text='Duration in minutes', blank=True, null=True)
    air_date = models.DateField(blank=True, null=True)
    video_file = models.FileField(upload_to='videos/', blank=True, null=True)
    thumbnail = models.ImageField(upload_to='episode_thumbnails/', blank=True, null=True)
    views_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    TRANSCODING_STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('processing', 'Processing'),
        ('completed', 'Completed'),
        ('failed', 'Failed'),
    ]
    transcoding_status = models.CharField(max_length=20, choices=TRANSCODING_STATUS_CHOICES, default='completed')
    optimized_video = models.FileField(upload_to='videos/optimized/', blank=True, null=True)
    hls_playlist = models.FileField(upload_to='videos/hls/', blank=True, null=True)

    def __str__(self):
        return f"{self.tv_show.title} - S{self.season_number:02d}E{self.episode_number:02d}"


class WatchHistory(models.Model):
    user = models.CharField(max_length=100, blank=True, null=True) # Django username
    guest_token = models.CharField(max_length=100, blank=True, null=True)
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, blank=True, null=True)
    episode = models.ForeignKey(Episode, on_delete=models.CASCADE, blank=True, null=True)
    watched_at = models.DateTimeField(auto_now=True)
    watch_duration = models.PositiveIntegerField(default=0)
    completed = models.BooleanField(default=False)


class UserWatchlist(models.Model):
    user = models.CharField(max_length=100)
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, blank=True, null=True)
    tv_show = models.ForeignKey(TVShow, on_delete=models.CASCADE, blank=True, null=True)
    added_at = models.DateTimeField(auto_now_add=True)


class Favorite(models.Model):
    user = models.CharField(max_length=100)
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, blank=True, null=True)
    tv_show = models.ForeignKey(TVShow, on_delete=models.CASCADE, blank=True, null=True)
    added_at = models.DateTimeField(auto_now_add=True)


class Review(models.Model):
    user = models.CharField(max_length=100)
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, blank=True, null=True, related_name='reviews')
    tv_show = models.ForeignKey(TVShow, on_delete=models.CASCADE, blank=True, null=True, related_name='reviews')
    rating = models.PositiveIntegerField()
    title = models.CharField(max_length=200, blank=True)
    content = models.TextField(blank=True)
    is_spoiler = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    helpful_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


# ─────────────────────────────────────────────
#  PAYROLL & AFFORDABILITY MODELS
# ─────────────────────────────────────────────

class PayrollPeriod(models.Model):
    month_code = models.CharField(max_length=50, unique=True) # e.g. "january-2024"
    name = models.CharField(max_length=100)
    STATUS = (('0', 'Inactive'), ('1', 'Active'), ('3', 'Transit'))
    status = models.CharField(max_length=10, choices=STATUS, default='1')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class PayrollTransaction(models.Model):
    employee_code = models.CharField(max_length=50)
    period_id = models.ForeignKey(PayrollPeriod, on_delete=models.CASCADE, related_name='transactions')
    amount = models.DecimalField(max_digits=12, decimal_places=2)
    transtype = models.CharField(max_length=50) # Earning / Deduction
    transname = models.CharField(max_length=100)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.employee_code} - {self.transname} ({self.amount})"


class AffordabilityFormula(models.Model):
    companyid = models.CharField(max_length=50)
    transtype = models.CharField(max_length=50)
    transname = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.companyid} - {self.transname}"


class LoanTransaction(models.Model):
    employee = models.CharField(max_length=50) # employee code
    monthly_pay = models.DecimalField(max_digits=12, decimal_places=2)
    transaction_status = models.IntegerField() # e.g. 5 means closed
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.employee} - {self.monthly_pay}"


class NonDeductionReason(models.Model):
    employee_code = models.CharField(max_length=50)
    period_id = models.ForeignKey(PayrollPeriod, on_delete=models.CASCADE)
    reason = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.employee_code} - {self.reason[:20]}"


class SubscriptionPlan(models.Model):
    name = models.CharField(max_length=100, unique=True)
    description = models.TextField(blank=True, default='')
    price = models.DecimalField(max_digits=10, decimal_places=2)
    period = models.CharField(max_length=50, default='/month')
    icon = models.CharField(max_length=20, default='zap')
    features = models.JSONField(default=list)
    display_order = models.PositiveIntegerField(default=0)
    is_popular = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_trial = models.BooleanField(default=False)
    max_devices = models.PositiveIntegerField(default=1)
    video_quality = models.CharField(max_length=50, default='720p')
    has_ads = models.BooleanField(default=True)
    early_access = models.BooleanField(default=False)
    priority_support = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class PaymentTransaction(models.Model):
    """
    Records Paystack (or other gateway) transactions so that we can
    deterministically grant / audit access entitlements.
    """
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('success', 'Success'),
        ('failed', 'Failed'),
    ]

    reference = models.CharField(max_length=100, unique=True)
    plan = models.ForeignKey(SubscriptionPlan, on_delete=models.PROTECT)
    movie = models.ForeignKey('Movie', on_delete=models.SET_NULL, null=True, blank=True)
    episode = models.ForeignKey('Episode', on_delete=models.SET_NULL, null=True, blank=True)

    user = models.ForeignKey(DjangoAuthUser, on_delete=models.SET_NULL, null=True, blank=True)
    guest_token = models.CharField(max_length=64, blank=True, default='')
    email = models.EmailField(blank=True, default='')

    amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    currency = models.CharField(max_length=10, default='GHS')

    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    raw_response = models.JSONField(blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'{self.reference} ({self.status})'


class MovieAccess(models.Model):
    """
    Grants access to either a specific movie (rental / 24h pass)
    or to all movies via a subscription plan.

    If user is null, guest_token is used as the identity.
    """
    ACCESS_TYPE_CHOICES = [
        ('rental', 'Single Movie Rental'),
        ('subscription', 'Subscription'),
    ]

    user = models.ForeignKey(DjangoAuthUser, on_delete=models.SET_NULL, null=True, blank=True)
    guest_token = models.CharField(max_length=64, blank=True, default='')
    email = models.EmailField(blank=True, default='')

    # When movie is null and access_type == 'subscription', this represents
    # global access across all movies.
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, null=True, blank=True)
    episode = models.ForeignKey(Episode, on_delete=models.CASCADE, null=True, blank=True)
    plan = models.ForeignKey(SubscriptionPlan, on_delete=models.PROTECT, null=True, blank=True)

    access_type = models.CharField(max_length=20, choices=ACCESS_TYPE_CHOICES)
    reference = models.CharField(max_length=100, blank=True, default='')

    granted_at = models.DateTimeField(default=timezone.now)
    expires_at = models.DateTimeField()
    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        indexes = [
            models.Index(fields=['guest_token']),
            models.Index(fields=['user']),
            models.Index(fields=['movie']),
            models.Index(fields=['access_type']),
            models.Index(fields=['expires_at']),
        ]

    def __str__(self):
        identity = self.user.username if self.user_id else (self.guest_token[:8] or 'unknown')
        scope = self.movie.title if self.movie_id else 'ALL_MOVIES'
        return f'{identity} -> {scope} ({self.access_type})'

# ─────────────────────────────────────────────
#  USER-FACING TABLES (Mirroring Admin)
# ─────────────────────────────────────────────

class MenuGroup(models.Model):
    code=models.CharField(max_length=10)
    name=models.CharField(max_length=50)
    description=models.CharField(max_length=200,null=True,blank=True)
    ENABLE='1'
    DISABLE='0'
    STATUS=(
        (DISABLE,'Disable'),
        (ENABLE,'Enable'),
    )
    status=models.CharField(max_length=20,choices=STATUS,default=ENABLE)
    date=models.DateTimeField(auto_created=True,auto_now=True)
    
    def __str__(self):
	    return self.name  

class MenuSubGroup(models.Model):
    menugpcode=models.CharField(max_length=50)
    code=models.CharField(max_length=50)
    name=models.CharField(max_length=100)
    namespace=models.CharField(max_length=255)
    icons=models.CharField(max_length=150)
    DISABLE='0'
    ENABLE='1'
    STATUS=(
        (DISABLE,'Disable'),
        (ENABLE,'Enable') 
    )
    status=models.CharField(max_length=20,choices=STATUS,default=ENABLE)
    date=models.DateTimeField(auto_created=True,auto_now=True)    
    def __str__(self):
        return self.name

class MenuSubGroupDetail(models.Model):
    menugpcode=models.CharField(max_length=50,blank=True,null=True)
    menucatcode=models.CharField(max_length=50,blank=True,null=True)
    code=models.CharField(max_length=50,blank=True,null=True)
    icons=models.CharField(max_length=150,blank=True,null=True)
    name=models.CharField(max_length=100,blank=True,null=True)
    namespace=models.CharField(max_length=255,blank=True,null=True)
    imageuniname=models.CharField(max_length=150,blank=True,null=True)
    STATUS=(
        ('0','Disable'),
        ('1','Enable')
    )
    status=models.CharField(max_length=20,choices=STATUS,default='1')
    NCI=(
        ('0','No notification icon'),
        ('1','Notification icon'),
    )
    notification=models.CharField(max_length=20,choices=NCI,default='0')
    SB=(
        ('0','Off'),
        ('1','On'),
    )
    sidebar=models.CharField(max_length=20,choices=SB,default='1')
    dashboard=models.CharField(max_length=20,choices=SB,default='1')
    windview=models.CharField(max_length=20,choices=SB,default='0')
    windviewgeneralreport=models.CharField(max_length=20,choices=SB,null=True,blank=True)
    windviewfinancialreport=models.CharField(max_length=20,choices=SB,null=True,blank=True)
    windviewstatisticalreport=models.CharField(max_length=20,choices=SB,null=True,blank=True)
    ACR=(
        ('1','General User'),
        ('2','Administrator Access Right.'),
    )
    admin_accessright=models.CharField(max_length=250,choices=ACR,default='1')
    date=models.DateTimeField(auto_created=True,auto_now=True)
    targeted=models.CharField(max_length=255,null=True,blank=True)
    viewer=models.CharField(max_length=255,null=True,blank=True)

    def __str__(self):
        return self.name

class MenuSubUsers(models.Model):
    usruserid=models.CharField(max_length=50)
    menudetcode=models.CharField(max_length=50,null=True,blank=True)
    STATUS=(
        ('0','Revoked'),
        ('1','Granted'),
    ) 
    status=models.CharField(max_length=50,choices=STATUS,default='1')
    addedby=models.CharField(max_length=50,null=True,blank=True)
    date=models.DateTimeField(auto_now=True,auto_created=True)

    def __str__(self):
        return self.usruserid+' '+self.menudetcode


class Roles(models.Model):
    code = models.CharField(max_length=50, unique=True)
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True, default='')
    STATUS = (('0', 'Inactive'), ('1', 'Active'))
    status = models.CharField(max_length=5, choices=STATUS, default='1')
    date = models.DateTimeField(auto_now=True, auto_created=True)

    def __str__(self):
        return self.name


class RoleMenus(models.Model):
    usruserid = models.CharField(max_length=50)   # role code
    menudetcode = models.CharField(max_length=50, null=True, blank=True)
    STATUS = (('0', 'Revoked'), ('1', 'Granted'))
    status = models.CharField(max_length=50, choices=STATUS, default='1')
    addedby = models.CharField(max_length=50, null=True, blank=True)
    date = models.DateTimeField(auto_now=True, auto_created=True)

    def __str__(self):
        return self.usruserid + ' ' + (self.menudetcode or '')


class Positions(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True, default='')
    STATUS = (('0', 'Inactive'), ('1', 'Active'))
    status = models.CharField(max_length=5, choices=STATUS, default='1')
    date = models.DateTimeField(auto_now=True, auto_created=True)

    def __str__(self):
        return self.name


class EventLog(models.Model):
    evtcode=models.CharField(max_length=100)
    memid=models.CharField(max_length=100)
    name=models.CharField(max_length=180)
    activities=models.CharField(max_length=600)
    evtdate = models.DateTimeField(auto_now=True, auto_created=True)
    ip=models.CharField(max_length=50)
    session_id=models.CharField(max_length=200)
    browser=models.CharField(max_length=300)

    def __str__(self):
        return f'{self.evtcode} - {self.activities}'

class EventType(models.Model):
    code=models.CharField(max_length=50)
    name=models.CharField(max_length=200)

    def __str__(self):
        return f'{self.code} - {self.name} '

class User(models.Model):
    code=models.CharField(max_length=50, unique=True)
    surname=models.CharField(max_length=100)
    othernames=models.CharField(max_length=100)
    password=models.CharField(max_length=400)
    username=models.CharField(max_length=50, unique=True)
    startdate=models.DateField(auto_now=True,auto_created=True)
    emergencyphone=models.CharField(max_length=255,null=True,blank=True)
    phoneno=models.CharField(max_length=100,null=True,blank=True)
    LEVEL=(
        ('1','administrator'),
        ('2','operator'),
        ('3','Manager'),
    )
    level=models.IntegerField(default=1)
    PWDCHANGESTATE=(
        ('0','Disabled'),
        ('1','Enabled')
    )
    passwordchange = models.CharField(max_length=50,choices=PWDCHANGESTATE,default='0')
    organisationcode = models.CharField(max_length=50, blank=True, default='')
    organisationname = models.CharField(max_length=150, blank=True, default='')
    regioncode = models.CharField(max_length=100, blank=True,default='')
    regionname = models.CharField(max_length=100, blank=True,default='')
    districtcode = models.CharField(max_length=100, blank=True,default='')
    districtname = models.CharField(max_length=100, blank=True,default='')
    position = models.CharField(max_length=100, blank=True,default='')
    email=models.CharField(max_length=255,null=True,blank=True)
    STATUS=(
        ('-1','Deleted'),
        ('0','Disabled'),
        ('1','Enabled'),
    )
    status=models.CharField(max_length=50,choices=STATUS,default='1')
    role_code = models.CharField(max_length=50, blank=True, default='')
    actorid=models.CharField(max_length=50,null=True,blank=True)
    actorname = models.CharField(max_length=150, blank=True, default='')
    type = models.CharField(max_length=50, blank=True,default='')
    date=models.DateTimeField(auto_now=True,auto_created=True)

    def __str__(self):
        return self.surname+' '+ self.othernames

class UserPermission(models.Model):
    usruserid=models.CharField(max_length=50)
    menudetcode=models.CharField(max_length=50,null=True,blank=True)
    STATUS=(
        ('0','Revoked'),
        ('1','Granted'),
    ) 
    status=models.CharField(max_length=50,choices=STATUS,default='1')
    addedby=models.CharField(max_length=50,null=True,blank=True)
    date=models.DateTimeField(auto_now=True,auto_created=True)

    def __str__(self):
        return self.usruserid+' '+self.menudetcode
