import { connection } from "next/server";
import { PanelShell } from "@/components/panel-shell";
import { requirePlatformAccess } from "@/lib/auth";
import { db } from "@/lib/db";

type Status="ready"|"pending"|"manual";
type Check={title:string;detail:string;status:Status};
const has=(name:string)=>Boolean(process.env[name]?.trim());
const isHttps=(value:string|undefined)=>Boolean(value&&/^https:\/\//i.test(value));
async function databaseIsAvailable(){try{await db.$queryRaw`SELECT 1`;return true;}catch{return false;}}

export default async function ProductionReadiness(){
  await connection();
  await requirePlatformAccess(["SUPER_ADMIN","ADMIN"]);
  const databaseReady=await databaseIsAvailable();
  const s3Ready=process.env.UPLOAD_DRIVER?.toLowerCase()==="s3"&&has("S3_BUCKET")&&has("S3_REGION")&&has("S3_PUBLIC_BASE_URL");
  const explicitS3Credentials=has("S3_ACCESS_KEY_ID")&&has("S3_SECRET_ACCESS_KEY");
  const appUrl=process.env.APP_URL;
  const rootDomain=process.env.ROOT_DOMAIN;
  const domainReady=isHttps(appUrl)&&Boolean(rootDomain&&!rootDomain.includes("localhost"));
  const asaasReady=has("ASAAS_API_KEY")&&has("ASAAS_WEBHOOK_TOKEN")&&has("ASAAS_API_URL");
  const passwordReady=has("SUPERADMIN_PASSWORD")&&process.env.SUPERADMIN_PASSWORD!=="change-me-before-seeding";
  const backupReady=process.env.DATABASE_BACKUP_ENABLED==="true"&&has("DATABASE_BACKUP_DESTINATION");
  const checks:Check[]=[
    {title:"Armazenamento de uploads",detail:s3Ready?"Driver S3, bucket, região e URL pública configurados.":"Defina UPLOAD_DRIVER=s3, S3_BUCKET, S3_REGION e S3_PUBLIC_BASE_URL.",status:s3Ready?"ready":"pending"},
    {title:"Credenciais do armazenamento",detail:explicitS3Credentials?"Credenciais S3 presentes no servidor.":"Confirme se o servidor usa uma função IAM ou configure as chaves S3.",status:explicitS3Credentials?"ready":"manual"},
    {title:"Domínio e HTTPS",detail:domainReady?`Aplicação configurada em ${appUrl}.`:"APP_URL deve usar HTTPS e ROOT_DOMAIN não pode apontar para localhost.",status:domainReady?"ready":"pending"},
    {title:"DNS e certificado",detail:"Abra o domínio público e confirme DNS, certificado válido e redirecionamento para HTTPS.",status:"manual"},
    {title:"Integração Asaas",detail:asaasReady?"API, endpoint e token do webhook estão definidos.":"Configure ASAAS_API_KEY, ASAAS_API_URL e um ASAAS_WEBHOOK_TOKEN exclusivo.",status:asaasReady?"ready":"pending"},
    {title:"Webhook do Asaas",detail:`Cadastre e teste POST ${appUrl??"https://seu-dominio"}/api/webhooks/asaas no painel do Asaas.`,status:"manual"},
    {title:"Senha do superadministrador",detail:passwordReady?"A senha padrão não está configurada no ambiente.":"Troque SUPERADMIN_PASSWORD e atualize o acesso antes da publicação.",status:passwordReady?"ready":"pending"},
    {title:"Conexão PostgreSQL",detail:databaseReady?"O banco respondeu à verificação SELECT 1.":"O PostgreSQL não respondeu. Inicie o serviço e confira DATABASE_URL.",status:databaseReady?"ready":"pending"},
    {title:"Backup automático",detail:backupReady?"Rotina e destino de backup foram declarados.":"Defina DATABASE_BACKUP_ENABLED=true e DATABASE_BACKUP_DESTINATION depois de configurar a rotina.",status:backupReady?"ready":"pending"},
    {title:"Restauração do backup",detail:"Restaure uma cópia em banco temporário e registre o resultado do teste.",status:"manual"},
    {title:"Testes e build finais",detail:"Execute pnpm test, pnpm lint e pnpm build no mesmo ambiente que será publicado.",status:"manual"},
  ];
  const totals={ready:checks.filter(c=>c.status==="ready").length,pending:checks.filter(c=>c.status==="pending").length,manual:checks.filter(c=>c.status==="manual").length};
  const labels={ready:"Pronto",pending:"Pendente",manual:"Conferir manualmente"};
  return <PanelShell eyebrow="SEGURANÇA E OPERAÇÃO" title="Pré-produção" admin activePath="/admin/pre-producao">
    <section className="preflight-summary"><article className="stat-card"><span>Configurações prontas</span><strong>{totals.ready}</strong><small>de {checks.length} verificações</small></article><article className="stat-card"><span>Pendências detectadas</span><strong>{totals.pending}</strong><small>exigem configuração</small></article><article className="stat-card"><span>Conferências externas</span><strong>{totals.manual}</strong><small>DNS, Asaas e operação</small></article></section>
    <section className="preflight-list">{checks.map(check=><article className="preflight-item" key={check.title}><span className={`preflight-icon ${check.status}`}>{check.status==="ready"?"✓":check.status==="pending"?"!":"?"}</span><div className="preflight-copy"><strong>{check.title}</strong><small>{check.detail}</small></div><span className={`preflight-badge ${check.status}`}>{labels[check.status]}</span></article>)}</section>
    <p className="preflight-note">A tela verifica a presença e o formato das configurações, sem mostrar chaves ou senhas. Atualize as variáveis no ambiente e recarregue a página. Os testes finais continuam disponíveis pelo comando <code>pnpm check</code>.</p>
  </PanelShell>;
}
