import { Result } from '@/lib/contracts/Result';
import { PageQuery } from '@/lib/contracts/page-queries/PageQuery';
import { LoginViewDataBuilder } from '@/lib/builders/view-data/LoginViewDataBuilder';
import { LoginViewData } from '@/lib/builders/view-data/types/LoginViewData';
import { AuthPageService } from '@/lib/services/auth/AuthPageService';
import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser';

export class LoginPageQuery implements PageQuery<LoginViewData, URLSearchParams | Record<string, string | string[] | undefined>> {
  async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<LoginViewData, string>> {
    // Parse and validate search parameters
    const parsedResult = SearchParamParser.parseAuth(searchParams);
    if (parsedResult.isErr()) {
      return Result.err(`Invalid search parameters: ${parsedResult.getError()}`);
    }

    const { returnTo, token } = parsedResult.unwrap();

    try {
      // Use service to process parameters
      const authService = new AuthPageService();
      const serviceResult = await authService.processLoginParams({ returnTo, token });
      
      if (serviceResult.isErr()) {
        return Result.err(serviceResult.getError().message);
      }

      // Transform to ViewData using builder
      const viewData = LoginViewDataBuilder.build(serviceResult.unwrap());
      return Result.ok(viewData);
    } catch (error: any) {
      return Result.err(error.message || 'Failed to execute login page query');
    }
  }

  // Static factory method for convenience
  static async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<LoginViewData, string>> {
    const query = new LoginPageQuery();
    return query.execute(searchParams);
  }
}
