from django.db import models
from organisations.models import Organisation

# Create your models here.
class MinistryReportSettings(models.Model):
    """
    Model to store custom settings for Ministry of Finance monthly reporting forms.
    Each organization can have only one set of settings.
    """
    organisation = models.ForeignKey(
    Organisation,
    on_delete=models.CASCADE,
    related_name='ministry_report_settings',
    help_text="Organization these settings belong to"
)
    report_title = models.CharField(max_length=255, blank=True, null=True)
    # SACCO Basic Details
    sacco_name = models.CharField(max_length=255, help_text="Official SACCO name")
    registration_number = models.CharField(max_length=100, blank=True, null=True)
    sacco_code = models.CharField(max_length=50, blank=True, null=True)
    physical_address = models.TextField(blank=True, null=True)
    district = models.CharField(max_length=100, blank=True, null=True)
    region = models.CharField(max_length=100, blank=True, null=True)
    registration_date = models.DateField(blank=True, null=True)
    registration_status = models.CharField(
        max_length=50,
        default='Registered',
        choices=[
            ('Registered', 'Registered'),
            ('Pending', 'Pending'),
            ('Unregistered', 'Unregistered')
        ]
    )

    # Contact Information
    email = models.EmailField(max_length=255, blank=True, null=True)
    telephone = models.CharField(max_length=50, blank=True, null=True)
    contact_person = models.CharField(max_length=255, default='SACCO Manager')

    # Manager Information
    manager_name = models.CharField(max_length=255, blank=True, null=True)
    manager_email = models.EmailField(max_length=255, blank=True, null=True)
    manager_phone = models.CharField(max_length=50, blank=True, null=True)

    # Chairperson Information
    chairperson_name = models.CharField(max_length=255, blank=True, null=True)
    chairperson_email = models.EmailField(max_length=255, blank=True, null=True)
    chairperson_phone = models.CharField(max_length=50, blank=True, null=True)

    # Chairperson SUPCO Information
    supco_chairperson_name = models.CharField(max_length=255, blank=True, null=True, help_text="SUPCO Chairperson Name")
    supco_chairperson_email = models.EmailField(max_length=255, blank=True, null=True)
    supco_chairperson_phone = models.CharField(max_length=50, blank=True, null=True)

    # Governance
    board_members_male = models.IntegerField(default=0, help_text="Number of male board members")
    board_members_female = models.IntegerField(default=0, help_text="Number of female board members")
    loan_committee_male = models.IntegerField(default=0)
    loan_committee_female = models.IntegerField(default=0)
    supervisory_committee_male = models.IntegerField(default=0)
    supervisory_committee_female = models.IntegerField(default=0)
    vetting_committee_male = models.IntegerField(default=0)
    vetting_committee_female = models.IntegerField(default=0)
    loan_committee_frequency = models.CharField(max_length=100, blank=True, null=True, help_text="e.g., Weekly, Monthly")
    board_meeting_frequency = models.CharField(max_length=100, blank=True, null=True)
    supco_visit_frequency = models.CharField(max_length=100, blank=True, null=True)
    last_agm_date = models.DateField(blank=True, null=True, help_text="Last Annual General Meeting Date")
    agm_reason = models.TextField(blank=True, null=True, help_text="Reason if AGM was not held")

    # Staffing
    male_staff = models.IntegerField(default=0, help_text="Total male staff")
    female_staff = models.IntegerField(default=0, help_text="Total female staff")
    management_staff_male = models.IntegerField(default=0)
    management_staff_female = models.IntegerField(default=0)
    support_staff_male = models.IntegerField(default=0)
    support_staff_female = models.IntegerField(default=0)
    field_officers_male = models.IntegerField(default=0)
    field_officers_female = models.IntegerField(default=0)

    # Report Header Customization
    report_header_title = models.TextField(
        default='MINISTRY OF FINANCE, PLANNING AND ECONOMIC DEVELOPMENT',
        help_text="Main report header title"
    )
    report_subtitle = models.CharField(
        max_length=255,
        default='MONTHLY SACCO REPORTING FORM',
        help_text="Report subtitle"
    )
    ministry_department = models.CharField(
        max_length=255,
        default='Directorate of Microfinance',
        help_text="Ministry department name"
    )
    ministry_address = models.TextField(
        default='Plot 2-12 Apollo Kaggwa Road, P.O. Box 8147, Kampala',
        help_text="Ministry physical address"
    )
    ministry_contact = models.CharField(
        max_length=255,
        default='Tel: +256-414-707000 | Email: info@finance.go.ug',
        help_text="Ministry contact information"
    )

    # Additional Notes
    sacco_manager_comments = models.TextField(blank=True, null=True, help_text="Comments from SACCO Manager")
    dco_comments = models.TextField(blank=True, null=True, help_text="District Commercial Officer comments")
    additional_notes = models.TextField(blank=True, null=True, help_text="Any additional notes")

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

    class Meta:
        db_table = 'ministry_report_settings'
        verbose_name = 'Ministry Report Setting'
        verbose_name_plural = 'Ministry Report Settings'
        ordering = ['-updated_at']

    def __str__(self):
        return f"Ministry Report Settings for {self.sacco_name} (Org: {self.organisation_id})"

    def get_total_board_members(self):
        """Returns total board members (male + female)"""
        return self.board_members_male + self.board_members_female

    def get_total_staff(self):
        """Returns total staff (male + female)"""
        return self.male_staff + self.female_staff


class SavingsAccountBalances(models.Model):
    id = models.BigIntegerField(primary_key=True)
    account_no = models.CharField(max_length=155)
    # open_date = models.DateTimeField()
    # dormancy_date = models.DateTimeField()
    customer_type_id =  models.BigIntegerField()
    customer_type_name = models.CharField(max_length=155)
    organisation_id  = models.BigIntegerField()
    has_members      = models.BooleanField()
    deleted          = models.BooleanField()
    is_active        = models.BooleanField()
    opened_by_id     = models.BigIntegerField()
    opened_by_name   = models.CharField(max_length=155)
    product_id       = models.BigIntegerField()
    dormancy_period  = models.IntegerField(default=0)
    min_balance      = models.FloatField()
    product_name     = models.CharField(max_length=155)
    currency_name    = models.CharField(max_length=155)
    currency_symbol  = models.CharField(max_length=155)
    currency_code    = models.CharField(max_length=155)
    customer_id      = models.BigIntegerField()
    customer_name    = models.CharField(max_length=155)
    customer_member_number = models.CharField(max_length=155)
    customer_old_member_number = models.CharField(max_length=155)
    status            = models.CharField(max_length=155)
    telephone         = models.CharField(max_length=155)
    gender            = models.CharField(max_length=155)
    branch_id         = models.BigIntegerField()
    branch_name       = models.CharField(max_length=155)
    branch_short_name = models.CharField(max_length=155)
    organisation_id   = models.BigIntegerField()
    organisation_name = models.CharField(max_length=155)
    villagename       = models.CharField(max_length=155)
    regionname        = models.CharField(max_length=155)
    physical_address  = models.CharField(max_length=155)
    credits              = models.FloatField()
    debits               = models.FloatField()
    blocked_amount       = models.FloatField()
    total_held_amount    = models.FloatField()
    credits_bf           = models.FloatField()
    debits_bf            = models.FloatField()
    blocked_amount_bf    = models.FloatField()
    total_held_amount_bf = models.FloatField()
    latest_date          = models.DateTimeField()
    last_updated         = models.DateTimeField()

    class Meta:
        managed = False
        db_table = "public\".\"savings_balances_func"


class ClearedOffLoansReport(models.Model):
    id = models.BigIntegerField(primary_key=True)
    name              = models.CharField(max_length=155)
    member_number     = models.CharField(max_length=155)
    old_member_number = models.CharField(max_length=155)
    total_interest_expected  = models.FloatField()
    total_principal_expected = models.FloatField()
    loan_start_date          = models.DateTimeField()
    loan_clear_off_date = models.CharField(max_length=155)
    
class RescheduledLoansReport(models.Model):
    id = models.BigIntegerField(primary_key=True)
    name              = models.CharField(max_length=155)
    member_number     = models.CharField(max_length=155)
    old_member_number = models.CharField(max_length=155)
    loan_start_date   = models.DateTimeField()
    loan_period       = models.CharField(max_length=155)
    period_type       = models.CharField(max_length=155)
    frequency_type    = models.CharField(max_length=155)
    frequency         = models.CharField(max_length=155)
    grace_period      = models.CharField(max_length=155)
    grace_period_type = models.CharField(max_length=155)
    int_rate          = models.CharField(max_length=155)
    int_method        = models.CharField(max_length=155)
    reschedule_date   = models.CharField(max_length=155)
    comment           = models.CharField(max_length=155)
    loan_officer_full_name   = models.CharField(max_length=155)
    reschedule_principal     = models.FloatField(default=0.0)
    reschedule_interest      = models.FloatField(default=0.0)
    total_interest_expected  = models.FloatField()
    total_principal_expected = models.FloatField()
    


    