-- =============================================================================
-- PostgreSQL Database Initialization Script for ScoreOdonto CRM
-- Conversion from MySQL with corrected encodings and standard constraints
-- =============================================================================

-- Clean up existing tables (with cascade for safety)
DROP TABLE IF EXISTS vinculos CASCADE;
DROP TABLE IF EXISTS usuarios CASCADE;
DROP TABLE IF EXISTS settings CASCADE;
DROP TABLE IF EXISTS procedimentos_valores_planos CASCADE;
DROP TABLE IF EXISTS procedimentos CASCADE;
DROP TABLE IF EXISTS planos CASCADE;
DROP TABLE IF EXISTS pacientes CASCADE;
DROP TABLE IF EXISTS notificacoes CASCADE;
DROP TABLE IF EXISTS leads CASCADE;
DROP TABLE IF EXISTS guias_odontologicas CASCADE;
DROP TABLE IF EXISTS gto_items CASCADE;
DROP TABLE IF EXISTS gto_builders CASCADE;
DROP TABLE IF EXISTS google_tokens CASCADE;
DROP TABLE IF EXISTS financeiro CASCADE;
DROP TABLE IF EXISTS especialidades CASCADE;
DROP TABLE IF EXISTS dentistas_horarios CASCADE;
DROP TABLE IF EXISTS agendamentos CASCADE;
DROP TABLE IF EXISTS dentistas CASCADE;
DROP TABLE IF EXISTS clinicas CASCADE;

-- 1. clinicas
CREATE TABLE clinicas (
  id varchar(50) NOT NULL,
  nome_fantasia varchar(255) NOT NULL,
  documento varchar(50) DEFAULT NULL,
  cor varchar(20) DEFAULT '#2563eb',
  createdAt timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

-- 2. dentistas
CREATE TABLE dentistas (
  id varchar(50) NOT NULL,
  clinica_id varchar(50) DEFAULT NULL,
  nome varchar(255) NOT NULL,
  email varchar(255) DEFAULT NULL,
  telefone varchar(20) DEFAULT NULL,
  corAgenda varchar(10) DEFAULT NULL,
  especialidade varchar(100) DEFAULT NULL,
  ativo smallint DEFAULT 1,
  ordem integer DEFAULT 0,
  PRIMARY KEY (id)
);

-- 3. agendamentos
CREATE TABLE agendamentos (
  id varchar(50) NOT NULL,
  clinica_id varchar(50) DEFAULT NULL,
  pacienteNome varchar(255) DEFAULT NULL,
  dentistaId varchar(50) DEFAULT NULL,
  start_time timestamp DEFAULT NULL,
  end_time timestamp DEFAULT NULL,
  status varchar(50) DEFAULT 'Pendente' CHECK (status IN ('Confirmado','Pendente','Concluido','Faltou')),
  procedimento varchar(255) DEFAULT NULL,
  observacoes text,
  PRIMARY KEY (id),
  CONSTRAINT unique_dentista_slot UNIQUE (dentistaId, start_time),
  CONSTRAINT agendamentos_ibfk_1 FOREIGN KEY (dentistaId) REFERENCES dentistas (id) ON DELETE SET NULL
);

-- 4. dentistas_horarios
CREATE TABLE dentistas_horarios (
  id varchar(50) NOT NULL,
  dentista_id varchar(50) NOT NULL,
  clinica_id varchar(50) NOT NULL,
  dia_semana integer NOT NULL,
  hora_inicio time NOT NULL,
  hora_fim time NOT NULL,
  ativo smallint DEFAULT 1,
  PRIMARY KEY (id)
);

-- 5. especialidades
CREATE TABLE especialidades (
  id varchar(50) NOT NULL,
  nome varchar(100) NOT NULL,
  descricao text,
  ordem integer DEFAULT 0,
  PRIMARY KEY (id)
);

-- 6. financeiro
CREATE TABLE financeiro (
  id varchar(50) NOT NULL,
  clinica_id varchar(50) DEFAULT NULL,
  pacienteNome varchar(255) DEFAULT NULL,
  descricao varchar(255) DEFAULT NULL,
  valor decimal(10,2) DEFAULT NULL,
  dataVencimento date DEFAULT NULL,
  status varchar(50) DEFAULT NULL CHECK (status IN ('Pago','Pendente','Atrasado')),
  formaPagamento varchar(50) DEFAULT NULL CHECK (formaPagamento IN ('Boleto','Pix','Cartão','Dinheiro')),
  tipo varchar(50) DEFAULT 'RECEITA' CHECK (tipo IN ('RECEITA','DESPESA')),
  PRIMARY KEY (id)
);

-- 7. google_tokens
CREATE TABLE google_tokens (
  owner_id varchar(255) NOT NULL,
  refresh_token text NOT NULL,
  access_token text,
  expiry_date bigint DEFAULT NULL,
  updated_at timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (owner_id)
);

-- 8. gto_builders
CREATE TABLE gto_builders (
  id varchar(50) NOT NULL,
  pacienteId varchar(50) NOT NULL,
  dentistaId varchar(50) NOT NULL,
  credenciadaId varchar(50) NOT NULL,
  status varchar(20) DEFAULT 'RASCUNHO',
  total decimal(10,2) DEFAULT '0.00',
  createdAt timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

-- 9. gto_items
CREATE TABLE gto_items (
  id varchar(50) NOT NULL,
  builderId varchar(50) NOT NULL,
  procedimentoId varchar(50) NOT NULL,
  codigoTUSS varchar(50) NOT NULL,
  descricao varchar(255) NOT NULL,
  dente varchar(10) DEFAULT NULL,
  face varchar(10) DEFAULT NULL,
  quantidade integer DEFAULT 1,
  valorUnitario decimal(10,2) NOT NULL,
  valorTotal decimal(10,2) NOT NULL,
  observacao text,
  anexosCount integer DEFAULT 0,
  codigoInterno varchar(50) DEFAULT NULL,
  PRIMARY KEY (id)
);

-- 10. guias_odontologicas
CREATE TABLE guias_odontologicas (
  id varchar(50) NOT NULL,
  numeroGuiaPrestador varchar(50) NOT NULL,
  numeroGuiaOperadora varchar(50) DEFAULT NULL,
  dataSolicitacao date NOT NULL,
  tipoTratamento varchar(100) NOT NULL,
  status varchar(50) NOT NULL,
  beneficiarioId varchar(50) NOT NULL,
  beneficiarioNome varchar(255) NOT NULL,
  beneficiarioIdentificacao varchar(50) NOT NULL,
  createdAt timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

-- 11. leads
CREATE TABLE leads (
  id varchar(50) NOT NULL,
  nome varchar(100) DEFAULT NULL,
  sobrenome varchar(100) DEFAULT NULL,
  cpf varchar(20) DEFAULT NULL,
  whatsapp varchar(20) DEFAULT NULL,
  tipoInteresse varchar(50) DEFAULT NULL CHECK (tipoInteresse IN ('Particular','Plano')),
  dataCadastro timestamp DEFAULT NULL,
  status varchar(50) DEFAULT NULL CHECK (status IN ('Novo','Convertido','Arquivado')),
  PRIMARY KEY (id)
);

-- 12. notificacoes
CREATE TABLE notificacoes (
  id varchar(50) NOT NULL,
  titulo varchar(255) DEFAULT NULL,
  mensagem text,
  tipo varchar(50) DEFAULT 'sistema' CHECK (tipo IN ('lead','sistema','agenda','financeiro')),
  lida smallint DEFAULT 0,
  data timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

-- 13. pacientes
CREATE TABLE pacientes (
  id varchar(50) NOT NULL,
  nome varchar(255) NOT NULL,
  cpf varchar(20) DEFAULT NULL,
  telefone varchar(20) DEFAULT NULL,
  email varchar(255) DEFAULT NULL,
  ultimoTratamento varchar(100) DEFAULT NULL,
  convenio varchar(100) DEFAULT NULL,
  dataNascimento varchar(20) DEFAULT NULL,
  PRIMARY KEY (id)
);

-- 14. planos
CREATE TABLE planos (
  id varchar(50) NOT NULL,
  nome varchar(100) NOT NULL,
  tipo varchar(50) DEFAULT NULL CHECK (tipo IN ('Convenio','Particular','Parceria')),
  descontoPadrao decimal(5,2) DEFAULT NULL,
  corCartao varchar(20) DEFAULT NULL,
  PRIMARY KEY (id)
);

-- 15. procedimentos
CREATE TABLE procedimentos (
  id varchar(50) NOT NULL,
  nome varchar(255) NOT NULL,
  descricao text,
  especialidadeId varchar(50) DEFAULT NULL,
  especialidadeNome varchar(100) DEFAULT NULL,
  valorParticular decimal(10,2) DEFAULT NULL,
  codigoInterno varchar(50) DEFAULT NULL,
  categoria varchar(50) DEFAULT 'Particular',
  tipo_regiao varchar(50) DEFAULT 'GERAL' CHECK (tipo_regiao IN ('DENTE','ARCO','GERAL')),
  exige_face smallint DEFAULT 0,
  codigo varchar(50) DEFAULT NULL,
  ordem integer DEFAULT 0,
  PRIMARY KEY (id),
  CONSTRAINT procedimentos_ibfk_1 FOREIGN KEY (especialidadeId) REFERENCES especialidades (id) ON DELETE SET NULL
);

-- 16. procedimentos_valores_planos
CREATE TABLE procedimentos_valores_planos (
  id serial NOT NULL,
  procedimentoId varchar(50) DEFAULT NULL,
  planoId varchar(50) DEFAULT NULL,
  planoNome varchar(100) DEFAULT NULL,
  valor decimal(10,2) DEFAULT NULL,
  codigoPlano varchar(50) DEFAULT NULL,
  PRIMARY KEY (id),
  CONSTRAINT procedimentos_valores_planos_ibfk_1 FOREIGN KEY (procedimentoId) REFERENCES procedimentos (id) ON DELETE CASCADE
);

-- 17. settings
CREATE TABLE settings (
  id varchar(50) NOT NULL,
  category varchar(50) NOT NULL,
  data text,
  PRIMARY KEY (id)
);

-- 18. usuarios
CREATE TABLE usuarios (
  id varchar(50) NOT NULL,
  nome varchar(255) DEFAULT NULL,
  email varchar(100) NOT NULL,
  senha varchar(255) NOT NULL,
  cro varchar(20) DEFAULT NULL,
  cro_uf varchar(2) DEFAULT NULL,
  celular varchar(20) DEFAULT NULL,
  especialidade varchar(100) DEFAULT NULL,
  cor_agenda varchar(20) DEFAULT '#2563eb',
  role varchar(50) DEFAULT 'admin' CHECK (role IN ('paciente','dentista','funcionario','donoclinica','admin')),
  createdAt timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  CONSTRAINT unique_email UNIQUE (email)
);

-- 19. vinculos
CREATE TABLE vinculos (
  id varchar(50) NOT NULL,
  usuario_id varchar(50) NOT NULL,
  clinica_id varchar(50) NOT NULL,
  role varchar(50) DEFAULT 'admin' CHECK (role IN ('paciente','dentista','funcionario','donoclinica','admin')),
  createdAt timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  CONSTRAINT user_clinica UNIQUE (usuario_id, clinica_id)
);

-- =============================================================================
-- STATIC DATA SEED (Corrected Encodings)
-- =============================================================================

-- clinicas
INSERT INTO clinicas VALUES ('c1','SCOREODONTO MATRIZ','00.000.000/0001-00','#059669','2026-03-10 15:55:57');
INSERT INTO clinicas VALUES ('c2','SCOREODONTO FILIAL SUL','00.000.000/0002-00','#2563eb','2026-03-10 15:55:57');

-- dentistas
INSERT INTO dentistas VALUES ('d1','c1','MURILO AMORIM','muriloamorim791@gmail.com','(67) 99999-1111','#10B981','ORTODONTIA',1,0);
INSERT INTO dentistas VALUES ('d2','c1','RUI CESAR VARGAS','ruibto@gmail.com','(67) 99999-2222','#3B82F6','IMPLANTE',1,0);

-- agendamentos
INSERT INTO agendamentos VALUES ('test_1',NULL,'WESLLEY ANTONY TELLES DA SILVA','d1','2026-02-27 12:03:07','2026-02-27 13:03:07','Pendente','TESTE',NULL);

-- especialidades
INSERT INTO especialidades VALUES ('0.29431554436274265','DENTISTICA','RESTAURAÇÕES',1);
INSERT INTO especialidades VALUES ('e1','ORTODONTIA','CORREÇÃO DA POSIÇÃO DOS DENTES E OSSOS MAXILARES',2);
INSERT INTO especialidades VALUES ('e2','IMPLANTODONTIA','IMPLANTES UNITÁRIOS E MÚLTIPLOS',4);
INSERT INTO especialidades VALUES ('e3','ENDODONTIA','TRATAMENTO DE CANAL E LESÕES PERIAPICAIS',3);
INSERT INTO especialidades VALUES ('e4','CLINICO GERAL','PROCEDIMENTOS BÁSICOS, LIMPEZA E RESTAURAÇÕES',0);

-- financeiro
INSERT INTO financeiro VALUES ('f1',NULL,'WESLLEY ANTONY','MANUTENÇÃO MENSAL ORTO',150.00,'2023-10-15','Pago','Pix','RECEITA');
INSERT INTO financeiro VALUES ('f2',NULL,'NICOLLY BEATRIZ','ENTRADA IMPLANTE',1200.00,'2023-10-20','Pendente','Boleto','RECEITA');

-- guias_odontologicas
INSERT INTO guias_odontologicas VALUES ('1','177903','O-001','2026-02-25','Tratamento Odontológico','AUTORIZADO','B1','RONEY OTTONI DE SOUZA','181442','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('2','178056','O-002','2026-02-25','Tratamento Odontológico','AUTORIZADO','B2','MILENA LIMA DIAS OTTONI DE SOUZA','157320','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('3','178179','O-003','2026-02-25','Tratamento Odontológico','AUTORIZADO','B3','EVANDRO MACHADO AZEMAN','2025100002341','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('4','177208','O-004','2026-02-24','Tratamento Odontológico','AUTORIZADO','B4','MARIA JULIA MIRANDA DA SILVA','145805','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('5','177335','O-005','2026-02-24','Tratamento Odontológico','AUTORIZADO_PARCIAL','B5','JOAO ITALO CORREA DE AMORIM SANT ANNA','443079','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('6','176468','O-006','2026-02-23','Urgência / Emergência','AUTORIZADO','B6','EDUARDO STENIO GONCALVES DOS SANTOS','435593','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('7','176572','O-007','2026-02-23','Tratamento Odontológico','AUTORIZADO','B7','LUCIA MARIA DA SILVA JULIO','127311','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('8','176666','O-008','2026-02-23','Tratamento Odontológico','AUTORIZADO','B8','JAIRO HIDEKI NAGAO','96512','2026-02-26 15:43:38');
INSERT INTO guias_odontologicas VALUES ('9','176721','O-009','2026-02-23','Tratamento Odontológico','AUTORIZADO','B8','JAIRO HIDEKI NAGAO','96512','2026-02-26 15:43:38');

-- notificacoes
INSERT INTO notificacoes VALUES ('notif_fin_overdue_f2','FATURA ATRASADA','A conta "ENTRADA IMPLANTE" de R$ 1200.00 venceu em 20/10/2023','financeiro',1,'2026-02-27 10:16:03');
INSERT INTO notificacoes VALUES ('notif_fin_overdue_f2_new','FATURA ATRASADA','A conta "ENTRADA IMPLANTE" de R$ 1200.00 venceu em 20/10/2023','financeiro',0,'2026-03-10 15:55:58');
INSERT INTO notificacoes VALUES ('notif_sys_setup','CONFIGURAÇÃO DO SISTEMA','O sistema possui poucos pacientes cadastrados. Considere importar dados.','sistema',1,'2026-02-27 10:16:03');

-- pacientes
INSERT INTO pacientes VALUES ('1','WESLLEY ANTONY TELLES DA SILVA','702.013.331-20','(67) 98125-2514','WESLLEY@EMAIL.COM','ORTO','CASSEMS','17/08/2000');
INSERT INTO pacientes VALUES ('2','NICOLLY BEATRIZ TEIXEIRA','101.034.232-06','(67) 99904-7557','NICOLLY@EMAIL.COM','LIMPEZA','ODONTOSEG','22/09/2010');
INSERT INTO pacientes VALUES ('3','ROSANGELA DUTRA','917.670.830-68','(67) 9272-2487','ROSANGELA@EMAIL.COM',NULL,'CASSEMS','23/11/1978');

-- planos
INSERT INTO planos VALUES ('p1','PARTICULAR','Particular',0.00,'#1f2937');
INSERT INTO planos VALUES ('p2','UNIMED ODONTO','Convenio',0.00,'#1eb545');
INSERT INTO planos VALUES ('p3','ODONTOPREV','Convenio',0.00,'#0066cc');
INSERT INTO planos VALUES ('p4','CASSEMS','Convenio',0.00,'#e63946');
INSERT INTO planos VALUES ('p5','SESI ODONTO','Convenio',0.00,'#f4a261');

-- procedimentos
INSERT INTO procedimentos VALUES ('proc1','CONSULTA INICIAL','AVALIAÇÃO INICIAL E PLANO DE TRATAMENTO','e4','CLÍNICO GERAL',150.00,NULL,'Particular','GERAL',0,NULL,0);
INSERT INTO procedimentos VALUES ('proc2','MANUTENÇÃO ORTODÔNTICA','MANUTENÇÃO MENSAL DE APARELHO FIXO','e1','ORTODONTIA',250.00,'','Particular','ARCO',0,'',0);

-- procedimentos_valores_planos
INSERT INTO procedimentos_valores_planos (procedimentoId,planoId,planoNome,valor,codigoPlano) VALUES ('proc1','p2','UNIMED ODONTO',80.00,NULL);
INSERT INTO procedimentos_valores_planos (procedimentoId,planoId,planoNome,valor,codigoPlano) VALUES ('proc1','p3','ODONTOPREV',75.00,NULL);

-- settings
INSERT INTO settings VALUES ('main','general','{"clinicEmail":"RECEP.CONSULTTCLINIC@GMAIL.COM","clinicCalendarId":"RECEP.CONSULTTCLINIC@GMAIL.COM","googleApiKey":"AIzaSyBOCClHTZU9e38VLDljXR-O4QVtk1gCZ1k","googleCalendarIds":{"d2":"ruibto@gmail.com","d1":"muriloamorim791@gmail.com"}}');

-- usuarios
INSERT INTO usuarios VALUES ('u1','RUI CESAR','admin@scoreodonto.com','admin',NULL,NULL,NULL,NULL,'#2563eb','admin','2026-03-10 16:27:04');
INSERT INTO usuarios VALUES ('u2','DENTISTA TESTE','dentista@scoreodonto.com','123456',NULL,NULL,NULL,NULL,'#2563eb','admin','2026-03-10 16:27:04');
INSERT INTO usuarios VALUES ('u3','FUNCIONARIO TESTE','funcionario@scoreodonto.com','cassems',NULL,NULL,NULL,NULL,'#2563eb','admin','2026-03-10 16:27:04');
INSERT INTO usuarios VALUES ('u4','DONO CLINICA','dono@scoreodonto.com','Rc362514',NULL,NULL,NULL,NULL,'#2563eb','admin','2026-03-10 16:27:04');
INSERT INTO usuarios VALUES ('u5','PACIENTE TESTE','paciente@scoreodonto.com','14253636',NULL,NULL,NULL,NULL,'#2563eb','admin','2026-03-10 16:27:04');

-- vinculos
INSERT INTO vinculos VALUES ('v_u1_c1','u1','c1','admin','2026-03-10 16:27:04');
INSERT INTO vinculos VALUES ('v_u1_c2','u1','c2','admin','2026-03-10 16:27:04');
INSERT INTO vinculos VALUES ('v_u2_c1','u2','c1','dentista','2026-03-10 16:27:04');
INSERT INTO vinculos VALUES ('v_u3_c1','u3','c1','funcionario','2026-03-10 16:27:04');
INSERT INTO vinculos VALUES ('v_u4_c1','u4','c1','donoclinica','2026-03-10 16:27:04');
INSERT INTO vinculos VALUES ('v_u4_c2','u4','c2','donoclinica','2026-03-10 16:27:04');
INSERT INTO vinculos VALUES ('v_u5_c1','u5','c1','paciente','2026-03-10 16:27:04');
