import { getAuthHeaders } from "./api-client";
import {
  CompanyProfile,
  RoleGroup,
  SystemPreferences,
  UserProfile,
} from "@/types/settings";

const API_BASE = (process.env.NEXT_PUBLIC_API_URL || "http://localhost:3333").replace(/\/$/, "") + "/api";

export const ALL_SYSTEM_MODULES = [
  { key: "dashboard", name: "Dashboard & Indicadores" },
  { key: "clientes", name: "Gestão de Clientes" },
  { key: "equipamentos", name: "Frota de Equipamentos" },
  { key: "categorias", name: "Categorias de Equipamentos" },
  { key: "locacoes", name: "Gestão de Locações" },
  { key: "reservas", name: "Reservas de Máquinas" },
  { key: "contratos", name: "Contratos & Minutas" },
  { key: "financeiro", name: "Módulo Financeiro & Caixa" },
  { key: "agenda", name: "Agenda & Cronograma" },
  { key: "manutencoes", name: "Manutenções & Oficinas (OS)" },
  { key: "fornecedores", name: "Gestão de Fornecedores" },
  { key: "relatorios", name: "Relatórios Gerenciais" },
  { key: "configuracoes", name: "Configurações do Sistema" },
];

export const DEFAULT_SYSTEM_ROLES: RoleGroup[] = [
  {
    id: "role-admin",
    name: "Administrador Geral",
    description: "Acesso total a todos os módulos do sistema e configurações avançadas.",
    isSystemDefault: true,
    permissions: ALL_SYSTEM_MODULES.map((m) => ({
      moduleKey: m.key,
      moduleName: m.name,
      canView: true,
      canCreate: true,
      canEdit: true,
      canDelete: true,
    })),
  },
  {
    id: "role-finance",
    name: "Gestor Financeiro",
    description: "Acesso a contas a receber, contas a pagar, fluxo de caixa e relatórios financeiros.",
    isSystemDefault: true,
    permissions: ALL_SYSTEM_MODULES.map((m) => ({
      moduleKey: m.key,
      moduleName: m.name,
      canView: ["dashboard", "clientes", "financeiro", "relatorios"].includes(m.key),
      canCreate: ["financeiro", "clientes"].includes(m.key),
      canEdit: ["financeiro", "clientes"].includes(m.key),
      canDelete: false,
    })),
  },
  {
    id: "role-operations",
    name: "Operador de Oficina",
    description: "Acesso à gestão de manutenção, equipamentos e ordem de serviço.",
    isSystemDefault: true,
    permissions: ALL_SYSTEM_MODULES.map((m) => ({
      moduleKey: m.key,
      moduleName: m.name,
      canView: ["dashboard", "equipamentos", "categorias", "manutencoes"].includes(m.key),
      canCreate: ["manutencoes", "equipamentos"].includes(m.key),
      canEdit: ["manutencoes", "equipamentos"].includes(m.key),
      canDelete: false,
    })),
  },
  {
    id: "role-manager",
    name: "Gerente Operacional",
    description: "Gestão comercial de contratos, locações, reservas, equipamentos e clientes.",
    isSystemDefault: true,
    permissions: ALL_SYSTEM_MODULES.map((m) => ({
      moduleKey: m.key,
      moduleName: m.name,
      canView: ["dashboard", "clientes", "equipamentos", "categorias", "locacoes", "reservas", "contratos", "agenda", "fornecedores", "relatorios"].includes(m.key),
      canCreate: ["clientes", "locacoes", "reservas", "contratos", "agenda"].includes(m.key),
      canEdit: ["clientes", "locacoes", "reservas", "contratos", "agenda"].includes(m.key),
      canDelete: false,
    })),
  },
  {
    id: "role-viewer",
    name: "Visualizador (Somente Leitura)",
    description: "Permissão apenas para consulta de informações nos módulos do ERP.",
    isSystemDefault: true,
    permissions: ALL_SYSTEM_MODULES.map((m) => ({
      moduleKey: m.key,
      moduleName: m.name,
      canView: true,
      canCreate: false,
      canEdit: false,
      canDelete: false,
    })),
  },
];

let localCompany: CompanyProfile = {
  id: "company-default",
  legalName: "BlackLoc Locações Industriais LTDA",
  tradeName: "BlackLoc",
  document: "12.345.678/0001-90",
  stateRegistration: "123.456.789.110",
  email: "contato@blackloc.com.br",
  phone: "(81) 3344-5566",
  logoUrl: null,
  zipCode: "50000-000",
  street: "Av. Principal",
  number: "1000",
  district: "Centro",
  city: "Recife",
  state: "PE",
};

let localUsers: UserProfile[] = [];

let localRoles: RoleGroup[] = [...DEFAULT_SYSTEM_ROLES];


let localPreferences: SystemPreferences = {
  defaultCurrency: "BRL",
  contractTermsFooter:
    "O locatário declara ter recebido os equipamentos em perfeitas condições de uso e funcionamento.",
  enableEmailAlerts: true,
  autoBackupDaily: true,
};

export async function getCompanyProfile(): Promise<CompanyProfile> {
  try {
    const res = await fetch(`${API_BASE}/company`, {
      headers: getAuthHeaders(),
      cache: "no-store",
    });
    if (res.ok) {
      const data = await res.json();
      localCompany = { ...localCompany, ...data };
      return localCompany;
    }
  } catch {
    // fallback
  }

  return localCompany;
}

export async function updateCompanyProfile(data: Partial<CompanyProfile>): Promise<CompanyProfile> {
  try {
    const res = await fetch(`${API_BASE}/company`, {
      method: "PATCH",
      headers: getAuthHeaders(),
      body: JSON.stringify(data),
    });
    if (res.ok) {
      const updated = await res.json();
      localCompany = { ...localCompany, ...updated };
      return localCompany;
    }
  } catch {
    // fallback
  }

  localCompany = { ...localCompany, ...data };
  return localCompany;
}

export async function getUsersList(): Promise<UserProfile[]> {
  try {
    const res = await fetch(`${API_BASE}/users`, {
      headers: getAuthHeaders(),
      cache: "no-store",
    });
    if (res.ok) {
      return await res.json();
    }
  } catch {
    // fallback
  }

  return localUsers;
}

export async function createUser(data: Partial<UserProfile>): Promise<UserProfile> {
  try {
    const res = await fetch(`${API_BASE}/users`, {
      method: "POST",
      headers: getAuthHeaders(),
      body: JSON.stringify(data),
    });
    if (res.ok) {
      return await res.json();
    }
  } catch {
    // fallback
  }

  const newUser: UserProfile = {
    id: `user-${Date.now()}`,
    name: data.name || "Novo Usuário",
    email: data.email || "usuario@rentx.com.br",
    role: data.role || "VIEWER",
    roleName: data.roleName || "Visualizador",
    active: data.active ?? true,
    createdAt: new Date().toISOString(),
  };

  localUsers = [newUser, ...localUsers];
  return newUser;
}

export async function updateUser(id: string, data: Partial<UserProfile>): Promise<UserProfile> {
  try {
    const res = await fetch(`${API_BASE}/users/${id}`, {
      method: "PATCH",
      headers: getAuthHeaders(),
      body: JSON.stringify(data),
    });
    if (res.ok) {
      return await res.json();
    }
  } catch {
    // fallback
  }

  const index = localUsers.findIndex((u) => u.id === id);
  if (index !== -1) {
    localUsers[index] = { ...localUsers[index], ...data };
    return localUsers[index];
  }
  throw new Error("Usuário não encontrado.");
}

export async function deleteUser(id: string): Promise<boolean> {
  try {
    const res = await fetch(`${API_BASE}/users/${id}`, {
      method: "DELETE",
      headers: getAuthHeaders(),
    });
    if (res.ok) return true;
  } catch {
    // fallback
  }

  localUsers = localUsers.filter((u) => u.id !== id);
  return true;
}

export async function getRoleGroups(): Promise<RoleGroup[]> {
  if (localRoles.length === 0) {
    localRoles = [...DEFAULT_SYSTEM_ROLES];
  }
  return localRoles;
}

export async function createRoleGroup(data: { name: string; description: string; permissions: any[] }): Promise<RoleGroup> {
  const newRole: RoleGroup = {
    id: `role-${Date.now()}`,
    name: data.name,
    description: data.description,
    isSystemDefault: false,
    permissions: data.permissions,
  };
  localRoles = [...localRoles, newRole];
  return newRole;
}

export async function updateRoleGroup(id: string, data: Partial<RoleGroup>): Promise<RoleGroup> {
  const idx = localRoles.findIndex((r) => r.id === id);
  if (idx !== -1) {
    localRoles[idx] = { ...localRoles[idx], ...data };
    return localRoles[idx];
  }
  throw new Error("Grupo não encontrado");
}

export async function deleteRoleGroup(id: string): Promise<boolean> {
  localRoles = localRoles.filter((r) => r.id !== id);
  return true;
}

export async function resetRoleGroups(): Promise<RoleGroup[]> {
  localRoles = JSON.parse(JSON.stringify(DEFAULT_SYSTEM_ROLES));
  return localRoles;
}


export async function getSystemPreferences(): Promise<SystemPreferences> {
  return localPreferences;
}

export async function updateSystemPreferences(data: Partial<SystemPreferences>): Promise<SystemPreferences> {
  localPreferences = { ...localPreferences, ...data };
  return localPreferences;
}
