// Profile Service - برای مدیریت پروفایل کاربر
import { API_BASE_URL } from "../config/api";
import { getAccessToken } from "../utils/auth";

export interface UserProfile {
  username: string;
  name: string;
  family: string;
  education_level: string;
  base: string;
  user_workflowID: string;
  image: string;
  nationalcode: string | null;
  user_stage_id: string;
  coin_count: number | null;
  user_id: string; // شناسه کاربر
}

export interface SaveProfileData {
  WorkflowID?: string; // اختیاری - فقط برای ویرایش
  user: {
    username: string;
    name: string;
    family: string;
    education_level: string;
    base: string;
    image?: string; // نام فایل تصویر آپلود شده
  };
}

// دریافت اطلاعات پروفایل کاربر
export const getUserProfile = async (): Promise<UserProfile | null> => {
  const token = getAccessToken();
  
  if (!token) {
    if (import.meta.env.DEV) console.warn("توکن احراز هویت یافت نشد");
    // در صورت نبود توکن، داده کش شده را برگردان
    return getCachedProfile();
  }

  try {
    const response = await fetch(`${API_BASE_URL}/api/call`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json;charset=UTF-8",
        "Authorization": `Bearer ${token}`,
      },
      body: JSON.stringify({
        get_user_profile_function: {}
      }),
    });

    if (!response.ok) {
      if (import.meta.env.DEV) console.warn(`خطا در دریافت اطلاعات پروفایل: ${response.status}`);
      // در صورت خطا، داده کش شده را برگردان
      return getCachedProfile();
    }

    const result = await response.json();
    
    if (result.state === 0 && result.data) {
      // پارس کردن data که به صورت JSON string است
      const parsedData = JSON.parse(result.data);
      
      if (parsedData.profile) {
        const profileArray = JSON.parse(parsedData.profile);
        
        if (profileArray && profileArray.length > 0) {
          const profile = profileArray[0];
          
          // ذخیره در localStorage
          localStorage.setItem("userProfile", JSON.stringify(profile));
          
          return profile;
        }
      }
    }
    
    // اگر پاسخ خالی بود، داده کش شده را برگردان
    return getCachedProfile();
  } catch (error) {
    if (import.meta.env.DEV) console.warn("خطا در دریافت پروفایل:", error);
    // در صورت خطای شبکه، داده کش شده را برگردان
    return getCachedProfile();
  }
};

// ذخیره یا ویرایش پروفایل
export const saveUserProfile = async (data: SaveProfileData): Promise<boolean> => {
  const token = getAccessToken();
  
  if (!token) {
    console.warn("توکن احراز هویت یافت نشد");
    return false;
  }

  try {
    const response = await fetch(`${API_BASE_URL}/api/save`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${token}`,
      },
      body: JSON.stringify(data),
    });

    if (!response.ok) {
      console.warn(`خطا در ذخیره اطلاعات پروفایل: ${response.status}`);
      // ذخیره موقت در localStorage
      const currentProfile = getCachedProfile();
      if (currentProfile) {
        const updatedProfile = {
          ...currentProfile,
          ...data.user,
        };
        localStorage.setItem("userProfile", JSON.stringify(updatedProfile));
      }
      return false;
    }

    const result = await response.json();
    
    if (result.state === 0) {
      // بعد از ذخیره موفق، مجدد اطلاعات پروفایل را دریافت کنیم
      await getUserProfile();
      return true;
    }
    
    return false;
  } catch (error) {
    console.warn("خطا در ذخیره پروفایل:", error);
    // ذخیره موقت در localStorage
    const currentProfile = getCachedProfile();
    if (currentProfile) {
      const updatedProfile = {
        ...currentProfile,
        ...data.user,
      };
      localStorage.setItem("userProfile", JSON.stringify(updatedProfile));
    }
    return false;
  }
};

// بررسی اینکه آیا پروفایل کامل است یا خیر
export const isProfileComplete = (profile: UserProfile | null): boolean => {
  if (!profile) return false;
  
  return !!(
    profile.name &&
    profile.family &&
    profile.education_level &&
    profile.base
  );
};

// دریافت پروفایل از localStorage
export const getCachedProfile = (): UserProfile | null => {
  const profileStr = localStorage.getItem("userProfile");
  if (!profileStr) return null;

  try {
    return JSON.parse(profileStr);
  } catch {
    return null;
  }
};

// اینترفیس‌های داده‌های پروفایل کامل
export interface ProfileChallenge {
  mission_title: string;
  mission_done_id: string;
  mission_id: string;
  status: string;
  coin_count: string;
  datetime1: string;
  mission_type: string;
}

export interface ProfileCoinTransaction {
  StageID: number;
  user_id: string;
  coin_count: string;
  description: string;
}

export interface ProfilePost {
  workflow_ID: string;
  StageID: number;
  user_id: string;
  person_stage_id: string;
  full_name: string;
  title: string;
  description: string;
  film: string;
  image: string;
  audio: string;
  mission_type: string;
  like_count?: number;
  dislike_count?: number;
  like_state?: "پسند" | "عدم پسند" | "";
  comment_count?: number;
}

export interface UserProfileData {
  challenges: ProfileChallenge[];
  coin_transaction: ProfileCoinTransaction[];
  posts: ProfilePost[];
}

// دریافت داده‌های کامل پروفایل (چالش‌ها، تراکنش‌ها، پست‌ها)
export const getUserProfileData = async (): Promise<UserProfileData | null> => {
  const token = getAccessToken();

  if (!token) {
    if (import.meta.env.DEV) console.warn("توکن احراز هویت یافت نشد");
    return null;
  }

  try {
    const response = await fetch(`${API_BASE_URL}/api/call`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json;charset=UTF-8",
        "Authorization": `Bearer ${token}`,
      },
      body: JSON.stringify({
        get_user_profile_function2: {}
      }),
    });

    if (!response.ok) {
      if (import.meta.env.DEV) console.warn(`خطا در دریافت داده‌های پروفایل: ${response.status}`);
      return null;
    }

    const result = await response.json();

    if (result.state === 0 && result.data) {
      // پارس کردن data که به صورت JSON string است
      const parsedData = JSON.parse(result.data);

      return {
        challenges: parsedData.challenges ? JSON.parse(parsedData.challenges) : [],
        coin_transaction: parsedData.coin_transaction ? JSON.parse(parsedData.coin_transaction) : [],
        posts: parsedData.posts ? JSON.parse(parsedData.posts) : [],
      };
    }

    return null;
  } catch (error) {
    if (import.meta.env.DEV) console.warn("خطا در دریافت داده‌های پروفایل:", error);
    return null;
  }
};