export interface Division {
  id: string;
  name: string;
  bn_name: string;
  lat: string;
  long: string;
}

export interface District {
  id: string;
  division_id: string;
  name: string;
  bn_name: string;
  lat: string;
  long: string;
  url?: string;
}

export interface Upazila {
  id: string;
  district_id: string;
  name: string;
  bn_name: string;
}

export interface UnionData {
  id: string;
  upazilla_id: string;
  name: string;
  bn_name: string;
  url: string;
}

export interface Union {
  type: string;
  name?: string;
  database?: string;
  data?: UnionData[];
}

export interface PostCode {
  district?: string;
  division_id: string;
  district_id?: string;
  upazila: string;
  postOffice: string;
  postCode: string;
}

export interface AddressFormProps {
  onSubmit?: (data: AddressFormData) => void;
  onChange?: (data: AddressFormData) => void;
  defaultValues?: Partial<AddressFormData>;
  errors?: AddressFormErrors;
  className?: string;
  showPostCode?: boolean;
  showStreet?: boolean;
  showUnion?: boolean;
  showLabels?: boolean;
  labels?: {
    division?: string | React.ReactNode;
    district?: string | React.ReactNode;
    upazila?: string | React.ReactNode;
    union?: string | React.ReactNode;
    postCode?: string | React.ReactNode;
    street?: string | React.ReactNode;
    submit?: string | React.ReactNode;
  };
  placeholders?: {
    division?: string;
    district?: string;
    upazila?: string;
    union?: string;
    postCode?: string;
    street?: string;
  };
  disabled?: boolean;
  submitButtonProps?: {
    className?: string;
    disabled?: boolean;
  };
  children?: React.ReactNode;
  theme?: Theme;
  validation?: AddressFormValidation;
  customLabels?: AddressFormLabels;
  customErrors?: AddressFormErrors;
  containerClassName?: string;
  labelClassName?: string;
  errorClassName?: string;
  inputContainerClassName?: string;
  language?: 'en' | 'bn';
}

export interface AddressFormData {
  division?: string;
  district?: string;
  upazila?: string;
  union?: string;
  postCode?: string;
  street?: string;
}

export interface AddressFormErrors {
  division?: string | React.ReactNode;
  district?: string | React.ReactNode;
  upazila?: string | React.ReactNode;
  union?: string | React.ReactNode;
  postCode?: string | React.ReactNode;
  street?: string | React.ReactNode;
}

export interface AddressFormValidation {
  division?: ValidationRules;
  district?: ValidationRules;
  upazila?: ValidationRules;
  union?: ValidationRules;
  postCode?: ValidationRules;
  street?: ValidationRules;
}

export interface SelectProps<T = string> {
  value?: T;
  onChange?: (value: T) => void;
  language?: 'en' | 'bn';
  className?: string;
  placeholder?: string;
  disabled?: boolean;
  theme?: Theme;
  validation?: ValidationRules;
  errorClassName?: string;
  labelClassName?: string;
  containerClassName?: string;
  customLabel?: string | React.ReactNode;
  customError?: string | React.ReactNode;
}

export interface PostOfficeSelectProps {
  division?: Division;
  district?: District;
  upazila?: Upazila;
  value?: PostCode;
  onChange?: (postOffice: PostCode) => void;
  language?: 'en' | 'bn';
  className?: string;
  placeholder?: string;
  customLabel?: string | React.ReactNode;
  customError?: string | React.ReactNode;
  theme?: Theme;
  errorClassName?: string;
  labelClassName?: string;
  containerClassName?: string;
}

export interface ValidationRules {
  required?: boolean;
  customValidation?: (value: any) => string | true;
}

export interface AddressFormLabels {
  division?: string | React.ReactNode;
  district?: string | React.ReactNode;
  upazila?: string | React.ReactNode;
  union?: string | React.ReactNode;
  postCode?: string | React.ReactNode;
  street?: string | React.ReactNode;
}

export interface Theme {
  colors?: {
    primary?: string;
    background?: string;
    border?: string;
  };
  borderRadius?: string;
  fontSize?: {
    input?: string;
  };
  spacing?: {
    input?: string;
    label?: string;
  };
}

export interface AddressFormProps {
  language?: 'en' | 'bn';
  onChange?: (address: AddressFormData) => void;
  onSubmit?: (data: AddressFormData) => void;
  defaultValues?: Partial<AddressFormData>;
  errors?: AddressFormErrors;
  className?: string;
  children?: React.ReactNode;
  theme?: Theme;
  validation?: AddressFormValidation;
  showPostCode?: boolean;
  showStreet?: boolean;
  showUnion?: boolean;
  showLabels?: boolean;
  labels?: {
    division?: string | React.ReactNode;
    district?: string | React.ReactNode;
    upazila?: string | React.ReactNode;
    union?: string | React.ReactNode;
    postCode?: string | React.ReactNode;
    street?: string | React.ReactNode;
    submit?: string | React.ReactNode;
  };
  placeholders?: {
    division?: string;
    district?: string;
    upazila?: string;
    union?: string;
    postCode?: string;
    street?: string;
  };
  customLabels?: AddressFormLabels;
  customErrors?: AddressFormErrors;
  containerClassName?: string;
  labelClassName?: string;
  errorClassName?: string;
  inputContainerClassName?: string;
  disabled?: boolean;
  submitButtonProps?: {
    className?: string;
    disabled?: boolean;
  };
}