﻿-- Tabla de redes sociales (SocialMedia) y relación uno a uno con Person
CREATE TABLE IF NOT EXISTS SocialMedia (
    Id TEXT PRIMARY KEY,
    Facebook TEXT,
    Instagram TEXT,
    Twitter TEXT,
    BlueSky TEXT,
    Tiktok TEXT,
    Linkedin TEXT,
    Pinterest TEXT,
    Discord TEXT,
    Reddit TEXT,
    Other TEXT
);

-- Person: cada persona tiene un grupo de redes sociales (uno a uno, fk opcional)
CREATE TABLE IF NOT EXISTS Persons (
    Id TEXT PRIMARY KEY,
    Name TEXT NOT NULL,
    ProfilePicture TEXT,
    Avatar TEXT,
    SocialMediaId TEXT,
    Bio TEXT,
    CreatedAt TEXT NOT NULL,
    UpdatedAt TEXT,
    FOREIGN KEY (SocialMediaId) REFERENCES SocialMedia(Id)
);

-- User: es una persona (herencia por clave primaria compartida)
CREATE TABLE IF NOT EXISTS Users (
    Id TEXT PRIMARY KEY,                 -- MISMA clave y valor que Persons.Id
    Email TEXT NOT NULL,
    Password TEXT NOT NULL,
    Salt TEXT NOT NULL,
    FOREIGN KEY (Id) REFERENCES Persons(Id)
);

-- Un usuario puede ver muchas galerías (muchos-a-muchos: Galleries <-> Users)
CREATE TABLE IF NOT EXISTS GalleryUserViewers (
    GalleryId TEXT NOT NULL,
    UserId TEXT NOT NULL,
    PRIMARY KEY (GalleryId, UserId),
    FOREIGN KEY (GalleryId) REFERENCES Galleries(Id),
    FOREIGN KEY (UserId) REFERENCES Users(Id)
);

-- Un usuario ha creado muchas galerías (uno a muchos)
-- Una galería solo puede ser creada por un usuario
CREATE TABLE IF NOT EXISTS Galleries (
    Id TEXT PRIMARY KEY,
    Title TEXT,
    Description TEXT,
    CreatedAt TEXT,
    UpdatedAt TEXT,
    CreatedBy TEXT NOT NULL,   -- FK a Users
    IsPublic INTEGER DEFAULT 1,
    IsArchived INTEGER DEFAULT 0,
    IsFavorite INTEGER DEFAULT 0,
    EventId TEXT,              -- FK opcional a Events (una galería puede asociarse a un evento)
    FOREIGN KEY (CreatedBy) REFERENCES Users(Id),
    FOREIGN KEY (EventId) REFERENCES Events(Id)
);

-- Galería-Photo: una galería contiene muchas imagenes, una imagen puede estar en muchas galerías (muchos-a-muchos)
CREATE TABLE IF NOT EXISTS GalleryPhotos (
    GalleryId TEXT NOT NULL,
    PhotoId TEXT NOT NULL,
    PRIMARY KEY (GalleryId, PhotoId),
    FOREIGN KEY (GalleryId) REFERENCES Galleries(Id),
    FOREIGN KEY (PhotoId) REFERENCES Photos(Id)
);

-- Tabla de eventos
CREATE TABLE IF NOT EXISTS Events (
    Id TEXT PRIMARY KEY,
    Title TEXT NOT NULL,
    Description TEXT,
    Date TEXT,
    Location TEXT,
    CreatedAt TEXT NOT NULL,
    UpdatedAt TEXT NOT NULL,
    CreatedBy TEXT,
    UpdatedBy TEXT,
    IsDeleted INTEGER NOT NULL DEFAULT 0,
    DeletedAt TEXT
);

-- Tabla de fotos
CREATE TABLE IF NOT EXISTS Photos (
    Id TEXT PRIMARY KEY,
    Title TEXT NOT NULL,
    Description TEXT,
    Extension TEXT,
    LowResUrl TEXT,
    MidResUrl TEXT,
    HighResUrl TEXT,
    CreatedAt TEXT,
    UpdatedAt TEXT,
    CreatedBy TEXT NOT NULL,      -- Persona que subió la foto: FK a Persons
    UpdatedBy TEXT,
    EventId TEXT,                 -- Una photo solo puede tener un evento asociado (FK)
    RankingId TEXT,
    IsFavorite INTEGER DEFAULT 0,
    IsPublic INTEGER DEFAULT 1,
    IsArchived INTEGER DEFAULT 0,
    FOREIGN KEY (CreatedBy) REFERENCES Persons(Id),
    FOREIGN KEY (EventId) REFERENCES Events(Id)
);

-- Una persona puede salir en muchas fotos, y una foto puede tener muchas personas (muchos-a-muchos)
CREATE TABLE IF NOT EXISTS PhotoPersons (
    PhotoId TEXT NOT NULL,
    PersonId TEXT NOT NULL,
    PRIMARY KEY (PhotoId, PersonId),
    FOREIGN KEY (PhotoId) REFERENCES Photos(Id),
    FOREIGN KEY (PersonId) REFERENCES Persons(Id)
);

-- Un usuario puede comprar muchas fotos para verlas, y una foto puede haber sido comprada por muchos usuarios  
-- (solo necesario si IsPublic = 0)
CREATE TABLE IF NOT EXISTS PhotoUserBuyers (
    PhotoId TEXT NOT NULL,
    UserId TEXT NOT NULL,
    PRIMARY KEY (PhotoId, UserId),
    FOREIGN KEY (PhotoId) REFERENCES Photos(Id),
    FOREIGN KEY (UserId) REFERENCES Users(Id)
);

-- Tabla de tags (únicos)
CREATE TABLE IF NOT EXISTS Tags (
    Id TEXT PRIMARY KEY,
    Name TEXT NOT NULL UNIQUE,
    CreatedAt TEXT NOT NULL
);

-- Una foto puede tener muchos tags (muchos-a-muchos)
CREATE TABLE IF NOT EXISTS PhotoTags (
    PhotoId TEXT NOT NULL,
    TagId TEXT NOT NULL,
    PRIMARY KEY (PhotoId, TagId),
    FOREIGN KEY (PhotoId) REFERENCES Photos(Id),
    FOREIGN KEY (TagId) REFERENCES Tags(Id)
);

-- Un evento puede tener muchos tags (muchos-a-muchos)
CREATE TABLE IF NOT EXISTS EventTags (
    EventId TEXT NOT NULL,
    TagId TEXT NOT NULL,
    PRIMARY KEY (EventId, TagId),
    FOREIGN KEY (EventId) REFERENCES Events(Id),
    FOREIGN KEY (TagId) REFERENCES Tags(Id)
);

-- Una galería puede tener muchos tags (muchos-a-muchos)
CREATE TABLE IF NOT EXISTS GalleryTags (
    GalleryId TEXT NOT NULL,
    TagId TEXT NOT NULL,
    PRIMARY KEY (GalleryId, TagId),
    FOREIGN KEY (GalleryId) REFERENCES Galleries(Id),
    FOREIGN KEY (TagId) REFERENCES Tags(Id)
);

-- Rankings (por si corresponde)
CREATE TABLE IF NOT EXISTS Rankings (
    Id TEXT PRIMARY KEY,
    TotalVotes INTEGER NOT NULL,
    UpVotes INTEGER NOT NULL,
    DownVotes INTEGER NOT NULL
);

-- Permissions y Roles, tal y como en el mensaje anterior...
CREATE TABLE IF NOT EXISTS Permissions (
    Id TEXT PRIMARY KEY,
    Name TEXT NOT NULL,
    Description TEXT
);

CREATE TABLE IF NOT EXISTS Roles (
    Id TEXT PRIMARY KEY,
    Name TEXT NOT NULL,
    Description TEXT,
    BaseRoleModelId TEXT,
    FOREIGN KEY (BaseRoleModelId) REFERENCES Roles(Id)
);

CREATE TABLE IF NOT EXISTS UserRoles (
    UserId TEXT NOT NULL,
    RoleId TEXT NOT NULL,
    PRIMARY KEY (UserId, RoleId),
    FOREIGN KEY (UserId) REFERENCES Users(Id),
    FOREIGN KEY (RoleId) REFERENCES Roles(Id)
);

CREATE TABLE IF NOT EXISTS RolePermissions (
    RoleId TEXT NOT NULL,
    PermissionId TEXT NOT NULL,
    PRIMARY KEY (RoleId, PermissionId),
    FOREIGN KEY (RoleId) REFERENCES Roles(Id),
    FOREIGN KEY (PermissionId) REFERENCES Permissions(Id)
);
