generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "rhel-openssl-1.1.x"]
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

// ─────────────────────────────────────────────
// ESTRUTURA ORGANIZACIONAL
// ─────────────────────────────────────────────

model Unidade {
  id        String   @id @default(cuid())
  nome      String
  endereco  String?
  cidade    String?
  telefone  String?
  ativa     Boolean  @default(true)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  turmas        Turma[]
  alunos        Aluno[]
  usuarios      Usuario[]
  fardamentos   Fardamento[]
  pedidos       Pedido[]
}

model Turma {
  id         String   @id @default(cuid())
  nome       String   // Ex: "3º Ano A", "Maternal II"
  serie      String?  // Ex: "3º Ano"
  turno      Turno    @default(MANHA)
  anoLetivo  Int      @default(2025)
  ativa      Boolean  @default(true)
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt

  unidadeId  String
  unidade    Unidade  @relation(fields: [unidadeId], references: [id])
  alunos     Aluno[]
}

enum Turno {
  MANHA
  TARDE
  INTEGRAL
  NOITE
}

// ─────────────────────────────────────────────
// USUÁRIOS E AUTENTICAÇÃO
// ─────────────────────────────────────────────

model Usuario {
  id            String    @id @default(cuid())
  nome          String
  email         String    @unique
  senhaHash     String?
  perfil        Perfil    @default(RESPONSAVEL)
  ativo         Boolean   @default(true)
  emailVerified DateTime?
  createdAt     DateTime  @default(now())
  updatedAt     DateTime  @updatedAt

  unidadeId     String?
  unidade       Unidade?  @relation(fields: [unidadeId], references: [id])

  responsavelDe  AlunoResponsavel[]
  pedidos        Pedido[]
  sessions       Session[]
  accounts       Account[]
}

enum Perfil {
  SUPER_ADMIN   // Acesso total ao sistema
  ADMIN         // Diretor / coordenador da unidade
  FUNCIONARIO   // Secretaria, com permissões específicas
  RESPONSAVEL   // Pai/mãe/responsável do aluno
}

// NextAuth tables
model Account {
  id                String  @id @default(cuid())
  userId            String
  type              String
  provider          String
  providerAccountId String
  refresh_token     String? @db.Text
  access_token      String? @db.Text
  expires_at        Int?
  token_type        String?
  scope             String?
  id_token          String? @db.Text
  session_state     String?
  user              Usuario @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([provider, providerAccountId])
}

model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         Usuario  @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime

  @@unique([identifier, token])
}

// ─────────────────────────────────────────────
// ALUNOS E RESPONSÁVEIS
// ─────────────────────────────────────────────

model Aluno {
  id          String   @id @default(cuid())
  nome        String
  matricula   String?  @unique
  dataNasc    DateTime?
  foto        String?
  ativo       Boolean  @default(true)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  turmaId     String?
  turma       Turma?   @relation(fields: [turmaId], references: [id])
  unidadeId   String
  unidade     Unidade  @relation(fields: [unidadeId], references: [id])

  responsaveis AlunoResponsavel[]
  itensPedido  ItemPedido[]
}

model AlunoResponsavel {
  id           String    @id @default(cuid())
  parentesco   String    // "Mãe", "Pai", "Avó", etc.
  principal    Boolean   @default(false) // responsável financeiro principal
  createdAt    DateTime  @default(now())

  alunoId      String
  aluno        Aluno     @relation(fields: [alunoId], references: [id], onDelete: Cascade)
  usuarioId    String
  usuario      Usuario   @relation(fields: [usuarioId], references: [id])

  @@unique([alunoId, usuarioId])
}

// ─────────────────────────────────────────────
// FARDAMENTOS
// ─────────────────────────────────────────────

model Fardamento {
  id          String       @id @default(cuid())
  nome        String       // Ex: "Vestido Feminino", "Camisa Polo Unissex"
  descricao   String?
  genero      Genero       @default(UNISSEX)
  categoria   String?      // Ex: "Uniforme Escolar", "Educação Física"
  imagens     Json         @default("[]") // Array de paths armazenado como JSON
  ativo       Boolean      @default(true)
  destaque    Boolean      @default(false)
  createdAt   DateTime     @default(now())
  updatedAt   DateTime     @updatedAt

  unidadeId   String
  unidade     Unidade      @relation(fields: [unidadeId], references: [id])

  tamanhos    FardamentoTamanho[]
}

enum Genero {
  MASCULINO
  FEMININO
  UNISSEX
}

model FardamentoTamanho {
  id            String     @id @default(cuid())
  tamanho       String     // Ex: "2 anos", "4 anos", "6 anos", "P", "M", "G", "GG"
  preco         Decimal    @db.Decimal(10, 2)
  estoque       Int        @default(0)
  estoqueMinimo Int        @default(2)  // alerta quando abaixo desse valor
  ativo         Boolean    @default(true)
  createdAt     DateTime   @default(now())
  updatedAt     DateTime   @updatedAt

  fardamentoId  String
  fardamento    Fardamento @relation(fields: [fardamentoId], references: [id], onDelete: Cascade)

  itensPedido   ItemPedido[]

  @@unique([fardamentoId, tamanho])
}

// ─────────────────────────────────────────────
// PEDIDOS E PAGAMENTOS
// ─────────────────────────────────────────────

model Pedido {
  id              String       @id @default(cuid())
  numero          String       @unique // Ex: "PED-2025-0001"
  status          StatusPedido @default(PENDENTE)
  total           Decimal      @db.Decimal(10, 2)
  observacao      String?
  createdAt       DateTime     @default(now())
  updatedAt       DateTime     @updatedAt

  usuarioId       String
  usuario         Usuario      @relation(fields: [usuarioId], references: [id])
  unidadeId       String
  unidade         Unidade      @relation(fields: [unidadeId], references: [id])

  itens           ItemPedido[]
  pagamento       Pagamento?
}

enum StatusPedido {
  PENDENTE         // Aguardando pagamento
  PAGO             // Pagamento confirmado
  EM_SEPARACAO     // Escola está separando os itens
  PRONTO           // Pronto para retirada
  ENTREGUE         // Entregue ao responsável
  CANCELADO        // Cancelado
}

model ItemPedido {
  id                  String            @id @default(cuid())
  quantidade          Int
  precoUnitario       Decimal           @db.Decimal(10, 2)
  createdAt           DateTime          @default(now())

  pedidoId            String
  pedido              Pedido            @relation(fields: [pedidoId], references: [id], onDelete: Cascade)
  fardamentoTamanhoId String
  fardamentoTamanho   FardamentoTamanho @relation(fields: [fardamentoTamanhoId], references: [id])
  alunoId             String
  aluno               Aluno             @relation(fields: [alunoId], references: [id])
}

model Pagamento {
  id              String         @id @default(cuid())
  metodo          MetodoPagto?
  status          StatusPagto    @default(PENDENTE)
  mpPaymentId     String?        // ID do pagamento no Mercado Pago
  mpPreferenceId  String?        // ID da preferência MP
  mpStatus        String?        // status retornado pelo MP
  pixQrCode       String?        @db.Text
  pixQrCodeBase64 String?        @db.Text
  pixExpiracao    DateTime?
  valor           Decimal        @db.Decimal(10, 2)
  paidAt          DateTime?
  createdAt       DateTime       @default(now())
  updatedAt       DateTime       @updatedAt

  pedidoId        String         @unique
  pedido          Pedido         @relation(fields: [pedidoId], references: [id], onDelete: Cascade)
}

enum MetodoPagto {
  PIX
  CARTAO_CREDITO
  CARTAO_DEBITO
}

enum StatusPagto {
  PENDENTE
  APROVADO
  RECUSADO
  REEMBOLSADO
  EM_PROCESSAMENTO
}
