import {
  createFindParams,
  createSelectParams,
  WithAdditionalData,
} from "@medusajs/medusa/api/utils/validators"
import { AdditionalData } from "@medusajs/framework/types"
import { SellerRole } from "@mercurjs/types"
import { z } from "zod"

export type VendorGetSellersParamsType = z.infer<typeof VendorGetSellersParams>
export const VendorGetSellersParams = createFindParams({
  offset: 0,
  limit: 50,
})

export type VendorGetSellerParamsType = z.infer<typeof VendorGetSellerParams>
export const VendorGetSellerParams = createSelectParams()

export type VendorCreateSellerAccountType = z.infer<typeof CreateSellerAccount> & AdditionalData
export const CreateSellerAccount = z.object({
  name: z.string(),
  handle: z.string().optional(),
  email: z.string().email(),
  phone: z.string().nullable().optional(),
  member_email: z.string().email(),
  first_name: z.string().nullable().optional(),
  last_name: z.string().nullable().optional(),
  description: z.string().nullable().optional(),
  currency_code: z.string(),
  address: z
    .object({
      name: z.string().nullable().optional(),
      company: z.string().nullable().optional(),
      first_name: z.string().optional(),
      last_name: z.string().optional(),
      address_1: z.string().optional(),
      address_2: z.string().nullable().optional(),
      city: z.string().optional(),
      country_code: z.string().optional(),
      province: z.string().nullable().optional(),
      postal_code: z.string().optional(),
      phone: z.string().nullable().optional(),
    })
    .optional(),
  professional_details: z
    .object({
      corporate_name: z.string().nullable().optional(),
      registration_number: z.string().nullable().optional(),
      tax_id: z.string().nullable().optional(),
    })
    .optional(),
  payment_details: z
    .object({
      country_code: z.string().optional(),
      holder_name: z.string().optional(),
      bank_name: z.string().nullable().optional(),
      iban: z.string().nullable().optional(),
      bic: z.string().nullable().optional(),
      routing_number: z.string().nullable().optional(),
      account_number: z.string().nullable().optional(),
    })
    .optional(),
  metadata: z.record(z.unknown()).nullable().optional(),
})
export const VendorCreateSellerAccount = WithAdditionalData(CreateSellerAccount)

export type VendorUpdateSellerType = z.infer<typeof UpdateSeller> & AdditionalData
export const UpdateSeller = z.object({
  name: z.string().optional(),
  handle: z.string().optional(),
  email: z.string().email().optional(),
  phone: z.string().nullable().optional(),
  description: z.string().nullable().optional(),
  logo: z.string().url().nullable().optional(),
  banner: z.string().url().nullable().optional(),
  website_url: z.string().nullable().optional(),
  closed_from: z.coerce.date().nullable().optional(),
  closed_to: z.coerce.date().nullable().optional(),
  closure_note: z.string().nullable().optional(),
  metadata: z.record(z.unknown()).nullable().optional(),
})
export const VendorUpdateSeller = WithAdditionalData(UpdateSeller)

export type VendorInviteMemberType = z.infer<typeof VendorInviteMember>
export const VendorInviteMember = z.object({
  email: z.string().email(),
  role_id: z.nativeEnum(SellerRole),
})

export type VendorUpdateMemberRoleType = z.infer<typeof VendorUpdateMemberRole>
export const VendorUpdateMemberRole = z.object({
  role_id: z.nativeEnum(SellerRole),
})

export type VendorUpsertSellerAddressType = z.infer<typeof UpsertSellerAddress> & AdditionalData
export const UpsertSellerAddress = z.object({
  name: z.string().nullable().optional(),
  company: z.string().nullable().optional(),
  first_name: z.string().nullable().optional(),
  last_name: z.string().nullable().optional(),
  address_1: z.string().nullable().optional(),
  address_2: z.string().nullable().optional(),
  city: z.string().nullable().optional(),
  country_code: z.string().nullable().optional(),
  province: z.string().nullable().optional(),
  postal_code: z.string().nullable().optional(),
  phone: z.string().nullable().optional(),
  metadata: z.record(z.unknown()).nullable().optional(),
})
export const VendorUpsertSellerAddress = WithAdditionalData(UpsertSellerAddress)

export type VendorUpsertSellerPaymentDetailsType = z.infer<typeof UpsertSellerPaymentDetails> & AdditionalData
export const UpsertSellerPaymentDetails = z.object({
  country_code: z.string().optional(),
  holder_name: z.string().optional(),
  bank_name: z.string().nullable().optional(),
  iban: z.string().nullable().optional(),
  bic: z.string().nullable().optional(),
  routing_number: z.string().nullable().optional(),
  account_number: z.string().nullable().optional(),
})
export const VendorUpsertSellerPaymentDetails = WithAdditionalData(UpsertSellerPaymentDetails)

export type VendorUpsertSellerProfessionalDetailsType = z.infer<typeof UpsertSellerProfessionalDetails> & AdditionalData
export const UpsertSellerProfessionalDetails = z.object({
  corporate_name: z.string().nullable().optional(),
  registration_number: z.string().nullable().optional(),
  tax_id: z.string().nullable().optional(),
})
export const VendorUpsertSellerProfessionalDetails = WithAdditionalData(UpsertSellerProfessionalDetails)

export type VendorSelectSellerType = z.infer<typeof VendorSelectSeller>
export const VendorSelectSeller = z.object({
  seller_id: z.string(),
})
