# Generated by Django 5.2.13 on 2026-04-25 08:27

import apps.core.storage.paths
import django.db.models.deletion
import django.utils.timezone
import django_fsm
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ("contenttypes", "0002_remove_content_type_name"),
        ("smehub_onboarding", "0001_initial"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="ConnectionRequest",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("target_object_id", models.CharField(max_length=64)),
                ("message", models.TextField(blank=True)),
                (
                    "status",
                    django_fsm.FSMField(
                        choices=[
                            ("pending", "Pending"),
                            ("accepted", "Accepted"),
                            ("declined", "Declined"),
                            ("withdrawn", "Withdrawn"),
                        ],
                        db_index=True,
                        default="pending",
                        max_length=16,
                        protected=True,
                    ),
                ),
                ("decline_reason", models.TextField(blank=True)),
                ("decided_at", models.DateTimeField(blank=True, null=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "decided_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "entrepreneur",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="connection_requests",
                        to="smehub_onboarding.entrepreneurprofile",
                    ),
                ),
                (
                    "target_content_type",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="+",
                        to="contenttypes.contenttype",
                    ),
                ),
            ],
            options={
                "ordering": ["-created_at"],
            },
        ),
        migrations.CreateModel(
            name="Connection",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("target_object_id", models.CharField(max_length=64)),
                (
                    "status",
                    models.CharField(
                        choices=[("active", "Active"), ("ended", "Ended")],
                        db_index=True,
                        default="active",
                        max_length=16,
                    ),
                ),
                ("ended_at", models.DateTimeField(blank=True, null=True)),
                ("ended_reason", models.TextField(blank=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "entrepreneur",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="connections",
                        to="smehub_onboarding.entrepreneurprofile",
                    ),
                ),
                (
                    "target_content_type",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="+",
                        to="contenttypes.contenttype",
                    ),
                ),
                (
                    "request",
                    models.OneToOneField(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="connection",
                        to="smehub_linkage.connectionrequest",
                    ),
                ),
            ],
            options={
                "ordering": ["-created_at"],
            },
        ),
        migrations.CreateModel(
            name="MoU",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("title", models.CharField(max_length=255)),
                ("summary", models.TextField(blank=True)),
                (
                    "draft_file",
                    models.FileField(
                        blank=True,
                        null=True,
                        upload_to=apps.core.storage.paths.upload_to_smehub_linkage,
                    ),
                ),
                (
                    "signed_file",
                    models.FileField(
                        blank=True,
                        null=True,
                        upload_to=apps.core.storage.paths.upload_to_smehub_linkage,
                    ),
                ),
                (
                    "status",
                    django_fsm.FSMField(
                        choices=[
                            ("draft", "Draft"),
                            ("under_review", "Under review"),
                            ("formalised", "Formalised"),
                            ("amended", "Amended"),
                            ("terminated", "Terminated"),
                        ],
                        db_index=True,
                        default="draft",
                        max_length=16,
                        protected=True,
                    ),
                ),
                ("formalised_at", models.DateTimeField(blank=True, null=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "connection",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="mous",
                        to="smehub_linkage.connection",
                    ),
                ),
                (
                    "created_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "formalised_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "parent_mou",
                    models.ForeignKey(
                        blank=True,
                        help_text="Set when this MoU is an amendment of an earlier formalised MoU (A5).",
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="amendments",
                        to="smehub_linkage.mou",
                    ),
                ),
            ],
            options={
                "ordering": ["-created_at"],
            },
        ),
        migrations.CreateModel(
            name="MoUComment",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("body", models.TextField()),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "author",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "mou",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="comments",
                        to="smehub_linkage.mou",
                    ),
                ),
                (
                    "parent",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="replies",
                        to="smehub_linkage.moucomment",
                    ),
                ),
            ],
            options={
                "ordering": ["created_at"],
            },
        ),
        migrations.CreateModel(
            name="MoUVersion",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("version_number", models.PositiveSmallIntegerField()),
                ("title", models.CharField(max_length=255)),
                ("summary", models.TextField(blank=True)),
                (
                    "file",
                    models.FileField(
                        blank=True,
                        null=True,
                        upload_to=apps.core.storage.paths.upload_to_smehub_linkage,
                    ),
                ),
                ("status_at_version", models.CharField(max_length=16)),
                ("notes", models.TextField(blank=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                (
                    "created_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "mou",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="versions",
                        to="smehub_linkage.mou",
                    ),
                ),
            ],
            options={
                "ordering": ["-version_number"],
            },
        ),
        migrations.CreateModel(
            name="OrganisationRecommendation",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "kind",
                    models.CharField(
                        choices=[
                            ("partner", "Partner"),
                            ("service_provider", "Service provider"),
                            ("buyer", "Buyer"),
                        ],
                        max_length=24,
                    ),
                ),
                ("organisation_name", models.CharField(max_length=255)),
                ("contact_email", models.EmailField(blank=True, max_length=254)),
                ("contact_phone", models.CharField(blank=True, max_length=64)),
                ("sector_focus", models.JSONField(blank=True, default=list)),
                ("geographic_coverage", models.JSONField(blank=True, default=list)),
                ("rationale", models.TextField(blank=True)),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("submitted", "Submitted"),
                            ("under_review", "Under review"),
                            ("adopted", "Adopted"),
                            ("dismissed", "Dismissed"),
                        ],
                        db_index=True,
                        default="submitted",
                        max_length=16,
                    ),
                ),
                ("handled_at", models.DateTimeField(blank=True, null=True)),
                ("handler_note", models.TextField(blank=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                (
                    "handled_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "suggested_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "ordering": ["-created_at"],
            },
        ),
        migrations.CreateModel(
            name="PartnerDirectoryEntry",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("organisation_name", models.CharField(max_length=255)),
                (
                    "org_type",
                    models.CharField(
                        choices=[
                            ("government", "Government"),
                            ("corporate", "Corporate"),
                            ("ngo", "NGO / non-profit"),
                            ("university", "University / research institute"),
                            ("foundation", "Foundation"),
                            ("cooperative", "Cooperative"),
                            ("other", "Other"),
                        ],
                        db_index=True,
                        max_length=32,
                    ),
                ),
                (
                    "sector_focus",
                    models.JSONField(
                        blank=True,
                        default=list,
                        help_text="Sector tags (matches BUSINESS choices); FRSME-MPL004 search facet.",
                    ),
                ),
                (
                    "geographic_coverage",
                    models.JSONField(
                        blank=True, default=list, help_text="ISO-2 country codes covered."
                    ),
                ),
                ("contact_email", models.EmailField(blank=True, max_length=254)),
                ("contact_phone", models.CharField(blank=True, max_length=64)),
                ("website", models.URLField(blank=True)),
                ("description", models.TextField(blank=True)),
                (
                    "areas_of_interest",
                    models.TextField(
                        blank=True,
                        help_text="Free-text statement of partnership / sourcing interests.",
                    ),
                ),
                (
                    "logo",
                    models.FileField(
                        blank=True,
                        null=True,
                        upload_to=apps.core.storage.paths.upload_to_smehub_linkage,
                    ),
                ),
                (
                    "verification_status",
                    django_fsm.FSMField(
                        choices=[
                            ("pending", "Pending verification"),
                            ("verified", "Verified"),
                            ("rejected", "Rejected"),
                        ],
                        db_index=True,
                        default="pending",
                        max_length=16,
                        protected=True,
                    ),
                ),
                ("verified_at", models.DateTimeField(blank=True, null=True)),
                ("rejection_reason", models.TextField(blank=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "managed_by",
                    models.ForeignKey(
                        blank=True,
                        help_text="Account that maintains this entry (FRSME-MPL002 self-managed).",
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "verified_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "verbose_name_plural": "Partner directory entries",
                "ordering": ["organisation_name"],
                "abstract": False,
            },
        ),
        migrations.CreateModel(
            name="RecommendationSnapshot",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("snapshot_id", models.UUIDField(default=uuid.uuid4, editable=False)),
                ("recommendations", models.JSONField(blank=True, default=list)),
                (
                    "based_on",
                    models.JSONField(
                        blank=True,
                        default=dict,
                        help_text="Inputs hash: business sectors / stages / geo / programmes.",
                    ),
                ),
                ("refreshed_at", models.DateTimeField(default=django.utils.timezone.now)),
                ("refreshed_by_signal", models.CharField(blank=True, max_length=64)),
                (
                    "is_fallback",
                    models.BooleanField(
                        default=False,
                        help_text="True when the AI backend was unavailable and a deterministic ranker was used.",
                    ),
                ),
                (
                    "entrepreneur",
                    models.OneToOneField(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="recommendation_snapshot",
                        to="smehub_onboarding.entrepreneurprofile",
                    ),
                ),
            ],
            options={
                "ordering": ["-refreshed_at"],
            },
        ),
        migrations.CreateModel(
            name="ServiceProviderEntry",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("organisation_name", models.CharField(max_length=255)),
                (
                    "org_type",
                    models.CharField(
                        choices=[
                            ("government", "Government"),
                            ("corporate", "Corporate"),
                            ("ngo", "NGO / non-profit"),
                            ("university", "University / research institute"),
                            ("foundation", "Foundation"),
                            ("cooperative", "Cooperative"),
                            ("other", "Other"),
                        ],
                        db_index=True,
                        max_length=32,
                    ),
                ),
                (
                    "sector_focus",
                    models.JSONField(
                        blank=True,
                        default=list,
                        help_text="Sector tags (matches BUSINESS choices); FRSME-MPL004 search facet.",
                    ),
                ),
                (
                    "geographic_coverage",
                    models.JSONField(
                        blank=True, default=list, help_text="ISO-2 country codes covered."
                    ),
                ),
                ("contact_email", models.EmailField(blank=True, max_length=254)),
                ("contact_phone", models.CharField(blank=True, max_length=64)),
                ("website", models.URLField(blank=True)),
                ("description", models.TextField(blank=True)),
                (
                    "areas_of_interest",
                    models.TextField(
                        blank=True,
                        help_text="Free-text statement of partnership / sourcing interests.",
                    ),
                ),
                (
                    "logo",
                    models.FileField(
                        blank=True,
                        null=True,
                        upload_to=apps.core.storage.paths.upload_to_smehub_linkage,
                    ),
                ),
                (
                    "verification_status",
                    django_fsm.FSMField(
                        choices=[
                            ("pending", "Pending verification"),
                            ("verified", "Verified"),
                            ("rejected", "Rejected"),
                        ],
                        db_index=True,
                        default="pending",
                        max_length=16,
                        protected=True,
                    ),
                ),
                ("verified_at", models.DateTimeField(blank=True, null=True)),
                ("rejection_reason", models.TextField(blank=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "service_offerings",
                    models.JSONField(
                        blank=True,
                        default=list,
                        help_text="Subset of ServiceOffering values (multi-select).",
                    ),
                ),
                (
                    "available_slots",
                    models.JSONField(
                        blank=True,
                        default=dict,
                        help_text="Free-form schedule payload — keyed advisory booking windows.",
                    ),
                ),
                (
                    "managed_by",
                    models.ForeignKey(
                        blank=True,
                        help_text="Account that maintains this entry (FRSME-MPL002 self-managed).",
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "verified_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "verbose_name_plural": "Service provider entries",
                "ordering": ["organisation_name"],
                "abstract": False,
            },
        ),
        migrations.CreateModel(
            name="AdvisorySession",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "type",
                    models.CharField(
                        choices=[("virtual", "Virtual"), ("physical", "Physical")],
                        default="virtual",
                        max_length=16,
                    ),
                ),
                ("starts_at", models.DateTimeField()),
                ("duration_minutes", models.PositiveSmallIntegerField(default=60)),
                ("location", models.CharField(blank=True, max_length=255)),
                ("agenda", models.TextField(blank=True)),
                ("notes", models.TextField(blank=True)),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("scheduled", "Scheduled"),
                            ("completed", "Completed"),
                            ("cancelled", "Cancelled"),
                            ("no_show", "No show"),
                        ],
                        db_index=True,
                        default="scheduled",
                        max_length=16,
                    ),
                ),
                ("completed_at", models.DateTimeField(blank=True, null=True)),
                ("cancellation_reason", models.CharField(blank=True, max_length=255)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "entrepreneur",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="advisory_sessions",
                        to="smehub_onboarding.entrepreneurprofile",
                    ),
                ),
                (
                    "service_provider",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="advisory_sessions",
                        to="smehub_linkage.serviceproviderentry",
                    ),
                ),
            ],
            options={
                "ordering": ["starts_at"],
            },
        ),
        migrations.AddIndex(
            model_name="connectionrequest",
            index=models.Index(
                fields=["target_content_type", "target_object_id", "status"],
                name="smehub_link_target__4e413d_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="connectionrequest",
            index=models.Index(
                fields=["entrepreneur", "status"], name="smehub_link_entrepr_56c4a6_idx"
            ),
        ),
        migrations.AddConstraint(
            model_name="connectionrequest",
            constraint=models.UniqueConstraint(
                condition=models.Q(("status", "pending")),
                fields=("entrepreneur", "target_content_type", "target_object_id"),
                name="uniq_smehub_pending_connection_request",
            ),
        ),
        migrations.AddIndex(
            model_name="connection",
            index=models.Index(
                fields=["entrepreneur", "status"], name="smehub_link_entrepr_e538e9_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="connection",
            index=models.Index(
                fields=["target_content_type", "target_object_id", "status"],
                name="smehub_link_target__123697_idx",
            ),
        ),
        migrations.AddConstraint(
            model_name="mouversion",
            constraint=models.UniqueConstraint(
                fields=("mou", "version_number"), name="uniq_smehub_mou_version"
            ),
        ),
        migrations.AddIndex(
            model_name="partnerdirectoryentry",
            index=models.Index(
                fields=["org_type", "verification_status"], name="smehub_link_org_typ_3e4143_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="serviceproviderentry",
            index=models.Index(
                fields=["org_type", "verification_status"], name="smehub_link_org_typ_8c53a3_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="advisorysession",
            index=models.Index(
                fields=["entrepreneur", "status"], name="smehub_link_entrepr_9f0f4d_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="advisorysession",
            index=models.Index(
                fields=["service_provider", "status"], name="smehub_link_service_401820_idx"
            ),
        ),
    ]
