from django.db import models
from django.contrib.auth.models import User
import uuid
from datetime import datetime

# Dataset model to connect Case and Control data
class Dataset(models.Model):
    title = models.CharField(max_length=255, unique=True)  # Title must be unique
    unique_id = models.CharField(max_length=12, unique=True)  # Identifier for the dataset
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="datasets")
    description = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def save(self, *args, **kwargs):
        # Generate a unique ID only if it doesn't already exist
        if not self.unique_id:
            timestamp = datetime.now().strftime('%Y%m%d%H%M')  # Format: YYYYMMDDHHMM
            unique_part = str(uuid.uuid4())[:4]  # Adding 4 random characters for uniqueness
            self.unique_id = f"{timestamp}{unique_part}"[:12]  # Ensure length is exactly 12
        super(Dataset, self).save(*args, **kwargs)

    def __str__(self):
        return f"Dataset: {self.title} - {self.unique_id}"

class ListedDatasets(models.Model):
    title = models.CharField(max_length=255, unique=True)  # Title for the listed dataset group
    datasets = models.ManyToManyField(Dataset, related_name="listings")  # Many-to-Many with Dataset
    created_at = models.DateTimeField(auto_now_add=True)  # Timestamp for creation
    updated_at = models.DateTimeField(auto_now=True)  # Timestamp for updates

    def __str__(self):
        return f"Listed Datasets: {self.title}"

# Case model for storing data specific to cases
class Case(models.Model):
    dataset = models.ForeignKey(Dataset, on_delete=models.CASCADE, related_name="cases")
    sl_no = models.IntegerField()
    id_no = models.CharField(max_length=50)
    # Demographic data
    age_years = models.IntegerField()
    occupation = models.CharField(max_length=255, null=True, blank=True)
    education = models.CharField(max_length=255, null=True, blank=True)
    income = models.CharField(max_length=255, null=True, blank=True)
    carbohydrate = models.CharField(max_length=255, null=True, blank=True)
    protein = models.CharField(max_length=255, null=True, blank=True)
    fats_source = models.CharField(max_length=255, null=True, blank=True)
    vegetable = models.CharField(max_length=255, null=True, blank=True)
    fruits = models.CharField(max_length=255, null=True, blank=True)
    vitamins = models.CharField(max_length=255, null=True, blank=True)
    minerals = models.CharField(max_length=255, null=True, blank=True)
    water_g_per_day = models.FloatField(null=True, blank=True)
    tea = models.CharField(max_length=255, null=True, blank=True)
    coffee = models.CharField(max_length=255, null=True, blank=True)
    betal_nuts = models.CharField(max_length=255, null=True, blank=True)
    jarda = models.CharField(max_length=255, null=True, blank=True)
    processed_food = models.CharField(max_length=255, null=True, blank=True)
    fast_food = models.CharField(max_length=255, null=True, blank=True)
    soft_drinks = models.CharField(max_length=255, null=True, blank=True)
    walking_hours = models.FloatField(null=True, blank=True)
    standing_hours = models.FloatField(null=True, blank=True)
    desk_job = models.CharField(max_length=255, null=True, blank=True)
    shift_d_n = models.CharField(max_length=255, null=True, blank=True)
    regular_exercise = models.CharField(max_length=255, null=True, blank=True)
    feeling_restless = models.CharField(max_length=255, null=True, blank=True)
    fatigue = models.CharField(max_length=255, null=True, blank=True)
    shortness_of_breath = models.CharField(max_length=255, null=True, blank=True)
    sleeping_hours = models.FloatField(null=True, blank=True)
    sound_sleep = models.CharField(max_length=255, null=True, blank=True)
    family_history_with_cancer = models.CharField(max_length=255, null=True, blank=True)
    
    # Abthripometric data
    height_m = models.FloatField()
    weight_kg = models.FloatField()
    bmi = models.FloatField()
    waist_circum_cm = models.FloatField()
    hip_circum_cm = models.FloatField()
    whr = models.FloatField()
    
    # Biochemical parameters data
    bp_sys = models.IntegerField()
    bp_dia = models.IntegerField()
    rbs = models.FloatField()
    hba1c = models.FloatField()
    hdl = models.FloatField()
    ldl = models.FloatField()
    tg = models.FloatField()
    tc = models.FloatField()
    tg_hdl = models.FloatField()
    ldl_hdl = models.FloatField()
    tc_hdl = models.FloatField()
    creatinine = models.FloatField()
    
    # Obstetric data
    menarche_age = models.IntegerField(null=True, blank=True)
    menstrual_status = models.CharField(max_length=255, null=True, blank=True)
    menopause_age = models.IntegerField(null=True, blank=True)
    age_at_first_birth = models.IntegerField(null=True, blank=True)
    parity = models.IntegerField(null=True, blank=True)
    lactation_situation = models.CharField(max_length=255, null=True, blank=True)
    breastfeeding_duration = models.FloatField(null=True, blank=True)
    use_contraceptive = models.CharField(max_length=255, null=True, blank=True)
    
    thyroidism_problem = models.CharField(max_length=255, null=True, blank=True)
    gastric = models.CharField(max_length=255, null=True, blank=True)
    antibiotic_intake = models.CharField(max_length=255, null=True, blank=True)
    diabetes = models.CharField(max_length=255, null=True, blank=True)
    
    # Additional Case-specific fields

    # Cancer-specific data
    age_at_diagnosis = models.IntegerField(null=True, blank=True)
    cancer_stage = models.CharField(max_length=255, null=True, blank=True)
    encounter_history = models.CharField(max_length=255,null=True, blank=True)
    er = models.CharField(max_length=255, null=True, blank=True)
    pr = models.CharField(max_length=255, null=True, blank=True)
    her2 = models.CharField(max_length=255, null=True, blank=True)
    tnbc = models.CharField(max_length=255, null=True, blank=True)
    breast_cancer_type = models.CharField(max_length=255, null=True, blank=True)
    histologic_type = models.CharField(max_length=255, null=True, blank=True)
    fnac = models.CharField(max_length=255, null=True, blank=True)
    pathology = models.CharField(max_length=255, null=True, blank=True)
    histopathology = models.CharField(max_length=255, null=True, blank=True)
    mammography = models.CharField(max_length=255, null=True, blank=True)
    physical = models.CharField(max_length=255, null=True, blank=True)
    ductal_extension = models.CharField(max_length=255, null=True, blank=True)

    # Treatment strategies data
    oral_medication = models.CharField(max_length=255, null=True, blank=True)
    hormone_therapy = models.CharField(max_length=255, null=True, blank=True)
    radio_therapy = models.CharField(max_length=255, null=True, blank=True)
    chemotherapy = models.CharField(max_length=255, null=True, blank=True)
    surgery = models.CharField(max_length=255, null=True, blank=True)

    cad = models.CharField(max_length=255, null=True, blank=True)
    respiratory_infection = models.CharField(max_length=255, null=True, blank=True)
    stroke = models.CharField(max_length=255, null=True, blank=True)

# Control model for storing data specific to controls
class Control(models.Model):
    dataset = models.ForeignKey(Dataset, on_delete=models.CASCADE, related_name="controls")
    sl_no = models.IntegerField()
    id_no = models.CharField(max_length=50)
    age_years = models.IntegerField()
    occupation = models.CharField(max_length=255, null=True, blank=True)
    height_m = models.FloatField()
    weight_kg = models.FloatField()
    bmi = models.FloatField()
    waist_circum_cm = models.FloatField()
    hip_circum_cm = models.FloatField()
    whr = models.FloatField()
    bp_sys = models.IntegerField()
    bp_dia = models.IntegerField()
    rbs = models.FloatField()
    hba1c = models.FloatField()
    tg = models.FloatField()
    hdl = models.FloatField()
    ldl = models.FloatField()
    tc = models.FloatField()
    tg_hdl = models.FloatField()
    ldl_hdl = models.FloatField()
    tc_hdl = models.FloatField()
    creatinine = models.FloatField()
    education = models.CharField(max_length=255, null=True, blank=True)
    income = models.CharField(max_length=255, null=True, blank=True)
    carbohydrate = models.CharField(max_length=255, null=True, blank=True)
    protein = models.CharField(max_length=255, null=True, blank=True)
    fats_source = models.CharField(max_length=255, null=True, blank=True)
    vegetable = models.CharField(max_length=255, null=True, blank=True)
    fruits = models.CharField(max_length=255, null=True, blank=True)
    vitamins = models.CharField(max_length=255, null=True, blank=True)
    minerals = models.CharField(max_length=255, null=True, blank=True)
    water_g_per_day = models.FloatField(null=True, blank=True)
    tea = models.CharField(max_length=255, null=True, blank=True)
    coffee = models.CharField(max_length=255, null=True, blank=True)
    betal_nuts = models.CharField(max_length=255, null=True, blank=True)
    jarda = models.CharField(max_length=255, null=True, blank=True)
    processed_food = models.CharField(max_length=255, null=True, blank=True)
    fast_food = models.CharField(max_length=255, null=True, blank=True)
    soft_drinks = models.CharField(max_length=255, null=True, blank=True)
    walking_hours = models.FloatField(null=True, blank=True)
    standing_hours = models.FloatField(null=True, blank=True)
    desk_job = models.CharField(max_length=255,null=True, blank=True)
    shift_d_n = models.CharField(max_length=255, null=True, blank=True)
    regular_exercise = models.CharField(max_length=255, null=True, blank=True)
    feeling_restless = models.CharField(max_length=255, null=True, blank=True)
    fatigue = models.CharField(max_length=255, null=True, blank=True)
    shortness_of_breath = models.CharField(max_length=255, null=True, blank=True)
    sleeping_hours = models.FloatField(null=True, blank=True)
    sound_sleep = models.CharField(max_length=255, null=True, blank=True)
    family_history_with_cancer = models.CharField(max_length=255, null=True, blank=True)
    menarche_age = models.IntegerField(null=True, blank=True)
    menstrual_status = models.CharField(max_length=255, null=True, blank=True)
    menopause_age = models.IntegerField(null=True, blank=True)
    parity = models.IntegerField(null=True, blank=True)
    age_at_first_birth = models.IntegerField(null=True, blank=True)
    lactation_situation = models.CharField(max_length=255, null=True, blank=True)
    breastfeeding_duration = models.FloatField(null=True, blank=True)
    use_contraceptive = models.CharField(max_length=255, null=True, blank=True)
    thyroidism_problem = models.CharField(max_length=255, null=True, blank=True)
    gastric = models.CharField(max_length=255, null=True, blank=True)
    antibiotic_intake = models.CharField(max_length=255, null=True, blank=True)
    diabetes = models.CharField(max_length=255, null=True, blank=True)
    # Extra fields
    athlete = models.CharField(max_length=255, null=True, blank=True)
    weight_lifting = models.CharField(max_length=255, null=True, blank=True)

class Group(models.Model):
    creator = models.ForeignKey(User, null=True, on_delete=models.CASCADE, help_text="User who created the group")
    name = models.CharField(max_length=255, help_text="Unique name for the group")
    description = models.TextField(blank=True, null=True, help_text="Optional description of the group")
    group_logic = models.JSONField(help_text="JSON data representing group logic and filters")
    group_logic_uriencoded = models.CharField(max_length=5000, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True, help_text="Timestamp when the group was created")
    updated_at = models.DateTimeField(auto_now=True, help_text="Timestamp when the group was last updated")

    def __str__(self):
        return self.name

class UniversalPresets(models.Model):
    groups = models.ManyToManyField('Group', related_name='universal_presets', help_text="Groups included in this universal preset")
    kid = models.CharField(max_length=255, blank=True, null=True, help_text="Optional identifier for the preset (e.g., category or dataset-specific key)")

    def __str__(self):
        return f"Universal Preset {self.kid or 'Default'}"