"use client";

import { useEffect, useState } from "react";
import { api } from "@/lib/api";
import { PageHeader, Card, Button, Input, Select, Checkbox, FormField, Skeleton } from "@/components/ui";
import { SettingsTabs } from "@/components/settings-tabs";
import { useToast } from "@/components/toast";

type Settings = {
  programName: string;
  autoApprove: boolean;
  cookieDays: number;
  attribution: string;
  commissionBase: string;
  defaultCommissionType: string;
  defaultCommissionValue: number;
  minPayout: number;
  commissionNewCustomersOnly: boolean;
  excludeSelfPurchase: boolean;
  recordNilSales: boolean;
  verifySalesAutomatically: boolean;
  commissionHoldDays: number;
  postCheckoutEnabled: boolean;
  postCheckoutHeading: string;
  postCheckoutText: string;
  postCheckoutButton: string;
  customerAffiliateConnect: boolean;
  mlmEnabled: boolean;
  mlmLevels: string;
  timezone: string;
  removeTrackingAfterOrder: boolean;
  recaptchaEnabled: boolean;
  recaptchaSiteKey: string;
  recaptchaSecret: string;
  payoutScheduleEnabled: boolean;
  payoutScheduleDay: number;
};

export default function SettingsPage() {
  const toast = useToast();
  const [form, setForm] = useState<Settings | null>(null);
  const [errors, setErrors] = useState<Record<string, string>>({});
  const [saving, setSaving] = useState(false);

  useEffect(() => {
    api.get("/admin/settings").then(setForm);
  }, []);

  const set = (k: keyof Settings, v: unknown) => setForm((f) => (f ? { ...f, [k]: v } : f));

  const save = async () => {
    if (!form) return;
    const e: Record<string, string> = {};
    if (!form.programName.trim()) e.programName = "Program name is required.";
    if (form.cookieDays < 0) e.cookieDays = "Must be 0 or more.";
    if (form.defaultCommissionValue < 0) e.defaultCommissionValue = "Must be 0 or more.";
    if (form.minPayout < 0) e.minPayout = "Must be 0 or more.";
    setErrors(e);
    if (Object.keys(e).length) {
      toast.error("Please fix the highlighted fields.");
      return;
    }
    setSaving(true);
    try {
      await api.put("/admin/settings", form);
      toast.success("Settings saved.");
    } catch (err) {
      toast.error((err as Error).message);
    } finally {
      setSaving(false);
    }
  };

  if (!form) {
    return (
      <div className="space-y-4">
        <Skeleton className="h-8 w-40" />
        <Skeleton className="h-40" />
        <Skeleton className="h-40" />
      </div>
    );
  }

  return (
    <div className="max-w-4xl">
      <PageHeader title="Settings" subtitle="Program rules" />
      <SettingsTabs />

      <div className="space-y-4">
        <Card title="Program">
          <FormField label="Program name" required error={errors.programName}>
            <Input error={!!errors.programName} value={form.programName ?? ""} onChange={(e) => set("programName", e.target.value)} />
          </FormField>
          <div className="mt-4 space-y-3">
            <Checkbox label="Auto-approve new affiliates" checked={form.autoApprove} onChange={(e) => set("autoApprove", e.target.checked)} />
            <Checkbox label="Give commission only for new customers" checked={form.commissionNewCustomersOnly} onChange={(e) => set("commissionNewCustomersOnly", e.target.checked)} />
            <Checkbox label="Don't record the affiliate's own purchases" checked={form.excludeSelfPurchase} onChange={(e) => set("excludeSelfPurchase", e.target.checked)} />
            <Checkbox label="Record nil sales (₹0 commission)" checked={form.recordNilSales} onChange={(e) => set("recordNilSales", e.target.checked)} />
            <Checkbox label="Verify sales automatically (auto-reverse cancelled/refunded orders)" checked={form.verifySalesAutomatically} onChange={(e) => set("verifySalesAutomatically", e.target.checked)} />
            <Checkbox label="Customer–affiliate connect (bind a customer's future orders to the affiliate)" checked={form.customerAffiliateConnect} onChange={(e) => set("customerAffiliateConnect", e.target.checked)} />
          </div>
        </Card>

        <Card title="Tracking">
          <div className="grid gap-4 sm:grid-cols-2">
            <FormField label="Cookie duration (days)" error={errors.cookieDays}>
              <Input type="number" min={0} error={!!errors.cookieDays} value={form.cookieDays} onChange={(e) => set("cookieDays", Number(e.target.value))} />
            </FormField>
            <FormField label="Conflict resolution">
              <Select value={form.attribution} onChange={(e) => set("attribution", e.target.value)}>
                <option value="LAST_CLICK">Last click wins</option>
                <option value="FIRST_CLICK">First click wins</option>
              </Select>
            </FormField>
            <FormField label="Timezone" hint="Used for reports & data downloads">
              <Input value={form.timezone} onChange={(e) => set("timezone", e.target.value)} placeholder="Asia/Kolkata" />
            </FormField>
            <div className="flex items-end">
              <Checkbox label="Remove tracking after order is placed" checked={form.removeTrackingAfterOrder} onChange={(e) => set("removeTrackingAfterOrder", e.target.checked)} />
            </div>
          </div>
        </Card>

        <Card title="Commission & payout">
          <div className="grid gap-4 sm:grid-cols-2">
            <FormField label="Default commission type">
              <Select value={form.defaultCommissionType} onChange={(e) => set("defaultCommissionType", e.target.value)}>
                <option value="PERCENT">Percent</option>
                <option value="FLAT">Flat</option>
              </Select>
            </FormField>
            <FormField label="Default commission value" error={errors.defaultCommissionValue}>
              <Input type="number" min={0} step="0.01" error={!!errors.defaultCommissionValue} value={form.defaultCommissionValue} onChange={(e) => set("defaultCommissionValue", Number(e.target.value))} />
            </FormField>
            <FormField label="Commission base">
              <Select value={form.commissionBase} onChange={(e) => set("commissionBase", e.target.value)}>
                <option value="SUBTOTAL">Subtotal</option>
                <option value="TOTAL">Total</option>
              </Select>
            </FormField>
            <FormField label="Minimum payout (₹)" error={errors.minPayout}>
              <Input type="number" min={0} step="0.01" error={!!errors.minPayout} value={form.minPayout} onChange={(e) => set("minPayout", Number(e.target.value))} />
            </FormField>
            <FormField label="Commission hold (days)" hint="Hold commission this many days before it's payable (refund window). 0 = instant.">
              <Input type="number" min={0} value={form.commissionHoldDays} onChange={(e) => set("commissionHoldDays", Number(e.target.value))} />
            </FormField>
          </div>
        </Card>

        <Card title="Multi-level (MLM)" subtitle="Affiliates recruit affiliates and earn override commission">
          <div className="space-y-4">
            <Checkbox label="Enable multi-level commissions" checked={form.mlmEnabled} onChange={(e) => set("mlmEnabled", e.target.checked)} />
            {form.mlmEnabled && (
              <FormField label="Override % per level" hint="Comma-separated, e.g. 10,5,2 → recruiter 10%, their recruiter 5%, next 2% (of the downline's commission)">
                <Input value={form.mlmLevels} onChange={(e) => set("mlmLevels", e.target.value)} placeholder="10,5,2" />
              </FormField>
            )}
          </div>
        </Card>

        <Card title="Security & automation">
          <div className="space-y-4">
            <Checkbox label="Enable Google reCAPTCHA on signup" checked={form.recaptchaEnabled} onChange={(e) => set("recaptchaEnabled", e.target.checked)} />
            {form.recaptchaEnabled && (
              <div className="grid gap-4 sm:grid-cols-2">
                <FormField label="reCAPTCHA site key"><Input value={form.recaptchaSiteKey} onChange={(e) => set("recaptchaSiteKey", e.target.value)} /></FormField>
                <FormField label="reCAPTCHA secret"><Input value={form.recaptchaSecret} onChange={(e) => set("recaptchaSecret", e.target.value)} placeholder="••••••" /></FormField>
              </div>
            )}
            <Checkbox label="Auto-schedule payouts monthly" checked={form.payoutScheduleEnabled} onChange={(e) => set("payoutScheduleEnabled", e.target.checked)} />
            {form.payoutScheduleEnabled && (
              <FormField label="Payout day of month" hint="Eligible affiliates get a payout request created on this day.">
                <Input type="number" min={1} max={28} value={form.payoutScheduleDay} onChange={(e) => set("payoutScheduleDay", Number(e.target.value))} />
              </FormField>
            )}
          </div>
        </Card>

        <Card title="Post-checkout popup" subtitle="Invite customers to become affiliates on the thank-you page">
          <div className="space-y-4">
            <Checkbox label="Show a 'become an affiliate' popup after checkout" checked={form.postCheckoutEnabled} onChange={(e) => set("postCheckoutEnabled", e.target.checked)} />
            {form.postCheckoutEnabled && (
              <>
                <FormField label="Heading"><Input value={form.postCheckoutHeading} onChange={(e) => set("postCheckoutHeading", e.target.value)} /></FormField>
                <FormField label="Text"><Input value={form.postCheckoutText} onChange={(e) => set("postCheckoutText", e.target.value)} /></FormField>
                <FormField label="Button label"><Input value={form.postCheckoutButton} onChange={(e) => set("postCheckoutButton", e.target.value)} /></FormField>
              </>
            )}
          </div>
        </Card>

        <div className="flex justify-end">
          <Button onClick={save} loading={saving}>Save settings</Button>
        </div>
      </div>
    </div>
  );
}
