import { wrapLayout } from '@/emails/booking-confirmation';
import { dash } from '@better-auth/infra';
import { betterAuth } from 'better-auth';
import { prismaAdapter } from 'better-auth/adapters/prisma';
import { openAPI } from 'better-auth/plugins';
import { sendMail } from './mailer';
import { db } from './prisma';

export const auth = betterAuth({
  database: prismaAdapter(db, {
    provider: 'postgresql',
  }),
  secret: process.env.BETTER_AUTH_SECRET,
  baseURL: process.env.BETTER_AUTH_URL,
  session: {
    cookieCache: {
      enabled: false,
    },
  },
  emailAndPassword: {
    enabled: true,
  },
  user: {
    additionalFields: {
      role: {
        type: 'string',
        required: false,
      },
      phone: {
        type: 'string',
        required: false,
      },
      banned: {
        type: 'boolean',
        required: false,
      },
      bannedAt: {
        type: 'string',
        required: false,
      },
      banReason: {
        type: 'string',
        required: false,
      },
    },
  },
  emailVerification: {
    sendOnSignUp: true,
    autoSignInAfterVerification: true,
    sendVerificationEmail: async ({ user, url }) => {
      const verificationUrl = new URL(url);
      const appUrl = process.env.APP_BASE_URL ?? 'http://localhost:5173';
      verificationUrl.searchParams.set('callbackURL', appUrl);

      const content = `
        <tr>
          <td style="padding:24px 20px 16px;">
            <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
              <tr>
                <td valign="top">
                  <table role="presentation" cellpadding="0" cellspacing="0" style="display:inline-block;background-color:#f4f4f5;border-radius:999px;padding:4px 12px;">
                    <tr>
                      <td style="font-size:11px;font-weight:700;letter-spacing:0.14em;color:#71717a;text-transform:uppercase;line-height:1.25rem;">
                        Verificaci&oacute;n de email
                      </td>
                    </tr>
                  </table>
                  <h1 style="margin:16px 0 0;font-size:24px;font-weight:700;color:#111827;letter-spacing:-0.025em;">
                    Verific&aacute; tu direcci&oacute;n de correo electr&oacute;nico
                  </h1>
                </td>
                <td valign="top" align="right" style="white-space:nowrap;">
                  <table role="presentation" cellpadding="0" cellspacing="0">
                    <tr>
                      <td valign="middle" style="padding-right:8px;">
                        <img src="${appUrl}/playzer-favicon-512-transparent.png" alt="Playzer" width="32" height="32" style="display:block;" />
                      </td>
                      <td valign="middle">
                        <span style="font-size:18px;font-weight:700;color:#475569;letter-spacing:-0.025em;">Playzer</span>
                      </td>
                    </tr>
                  </table>
                </td>
              </tr>
            </table>
          </td>
        </tr>

        <tr>
padding:0 20px 16px;
            <p style="margin:0;font-size:15px;color:#374151;line-height:1.6;">
              Hac&eacute; click en el bot&oacute;n de abajo para verificar tu direcci&oacute;n de correo electr&oacute;nico y empezar a usar Playzer.
            </p>
          </td>
        </tr>

        <tr>
          <td style="padding:0 20px 24px;">
            <table role="presentation" cellpadding="0" cellspacing="0">
              <tr>
                <td style="background-color:#059669;border-radius:12px;text-align:center;">
                  <a href="${verificationUrl.toString()}" style="display:block;padding:14px 32px;font-size:15px;font-weight:600;color:#ffffff;text-decoration:none;line-height:1.25rem;">Verificar email</a>
                </td>
              </tr>
            </table>
          </td>
        </tr>

        <tr>
          <td style="padding:0 20px 24px;">
            <p style="margin:0;font-size:13px;color:#9ca3af;text-align:center;line-height:1.5;">
              Si no creaste una cuenta en Playzer, ignor&aacute; este mensaje.
            </p>
          </td>
        </tr>`;

      await sendMail({
        to: user.email,
        subject: 'Verificá tu email en Playzer',
        html: wrapLayout(content),
        text: `Hacé click para verificar tu email: ${verificationUrl.toString()}`,
      });
    },
  },
  socialProviders: {
    google: {
      clientId: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
    },
  },
  trustedOrigins: [
    process.env.APP_BASE_URL ?? 'http://localhost:5173',
    process.env.BETTER_AUTH_URL ?? 'http://localhost:3000',
  ],
  plugins: [openAPI(), dash()],
});

export type Session = typeof auth.$Infer.Session.session;
export type User = typeof auth.$Infer.Session.user;
